vue3.2自定义弹窗组件结合函数式调用示例详解

yizhihongxing

下面我来详细讲解“vue3.2自定义弹窗组件结合函数式调用示例详解”的完整攻略。

1. 简介

Vue3.2中,我们可以通过自定义弹窗组件来方便地实现页面弹窗的功能,并且通过函数式调用的方式来减少对全局状态的依赖。

2. 自定义弹窗组件

首先,我们需要创建一个自定义的弹窗组件。可以使用Vue3的defineComponent函数来定义组件,代码如下:

import { defineComponent, ref } from 'vue';

export default defineComponent({
  name: 'MyDialog',
  props: {
    visible: {
      type: Boolean,
      default: false,
    },
    title: {
      type: String,
      default: '',
    },
    content: {
      type: String,
      default: '',
    },
    confirmText: {
      type: String,
      default: '确认',
    },
    cancelText: {
      type: String,
      default: '取消',
    },
    onConfirm: {
      type: Function,
      default: () => {},
    },
    onCancel: {
      type: Function,
      default: () => {},
    },
  },
  setup(props, { emit }) {
    const dialogVisible = ref(false);

    const handleConfirm = () => {
      emit('confirm');
      dialogVisible.value = false;
    };

    const handleCancel = () => {
      emit('cancel');
      dialogVisible.value = false;
    };

    const handleShowDialog = () => {
      dialogVisible.value = true;
    };

    return {
      dialogVisible,
      handleConfirm,
      handleCancel,
      handleShowDialog,
    };
  },
  render() {
    return (
      <div>
        <teleport to="body">
          <div class={['dialog-mask', { 'is-visible': this.dialogVisible }]}></div>
          <div class={['dialog', { 'is-visible': this.dialogVisible }]}>
            <div class="dialog-header">{this.title}</div>
            <div class="dialog-content">{this.content}</div>
            <div class="dialog-footer">
              <button class="btn-cancel" onClick={this.handleCancel}>
                {this.cancelText}
              </button>
              <button class="btn-confirm" onClick={this.handleConfirm}>
                {[this.confirmText]}
              </button>
            </div>
          </div>
        </teleport>
      </div>
    );
  },
});

在组件的setup函数中定义了一些状态和方法,包括弹窗的可见状态、确认和取消方法等。在render函数中,我们使用teleport组件将弹窗的内容渲染到body标签中,然后根据弹窗状态的值来动态设置弹窗的可见性。

3. 函数式调用

在使用自定义的弹窗组件时,我们可以通过函数式调用的方式来创建弹窗实例,而不需要依赖全局状态。

我们可以创建一个名为useDialog的hook,代码如下:

import { defineComponent, h, Teleport } from 'vue';
import MyDialog from './MyDialog';

export default function useDialog() {
  let vnode = null;

  function openDialog({ title, content, onConfirm, onCancel }) {
    const div = document.createElement('div');
    document.body.appendChild(div);

    const handleClose = () => {
      vnode.component.proxy.$destroy();
      vnode.el.parentNode.removeChild(vnode.el);
      vnode = null;
      onCancel && onCancel();
    };

    const handleConfirm = () => {
      vnode.component.proxy.$destroy();
      vnode.el.parentNode.removeChild(vnode.el);
      vnode = null;
      onConfirm && onConfirm();
    };

    const props = { title, content, onConfirm: handleConfirm, onCancel: handleClose };
    const dialog = h(MyDialog, { ...props, visible: true });

    vnode = h(Teleport, { to: 'body' }, dialog);
    vnode.component.render();
    vnode.el = vnode.component.subTree.el;
    div.appendChild(vnode.el);
  }

  return { openDialog };
}

useDialog函数会返回一个包含openDialog方法的对象,该方法可以传入弹窗的一些参数,并且在调用时创建弹窗实例并渲染到页面中。在函数内部,我们创建一个新的div元素,并且创建弹窗的确认和取消方法,同时将这些方法作为参数传递给自定义弹窗组件。最后,使用Teleport组件将弹窗渲染到body标签中。

4. 示例说明

以下是一个简单示例。我们可以在父组件中导入useDialog hook,并且可以通过按钮来打开弹窗。

<template>
  <button @click="handleClick">打开弹窗</button>
</template>

<script>
import { defineComponent } from 'vue';
import useDialog from './useDialog';

export default defineComponent({
  setup() {
    const { openDialog } = useDialog();

    const handleClick = () => {
      openDialog({
        title: '提示',
        content: '你确定要执行这个操作吗?',
        onConfirm: () => {
          alert('确认');
        },
        onCancel: () => {
          alert('取消');
        },
      });
    };

    return {
      handleClick,
    };
  },
});
</script>

以上是一个简单的使用自定义弹窗组件和函数式调用的示例,希望可以对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue3.2自定义弹窗组件结合函数式调用示例详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • vue项目前端埋点的实现

    下面是关于“vue项目前端埋点实现”的完整攻略: 什么是前端埋点? 前端埋点是指在页面中添加一些跟踪代码,记录用户行为、操作等数据,并将这些数据发送到后台进行统计分析的过程。前端埋点可以用来了解用户的兴趣、行为习惯等,方便网站开发者及时发现问题,为优化网站提供数据支持。 前端埋点的实现方式 前端埋点的实现方式通常有两种,一种是通过在路由钩子函数中进行埋点,另…

    Vue 2023年5月29日
    00
  • VUE响应式原理的实现详解

    VUE响应式原理的实现详解 介绍 VUE是一个MVVM模式的渐进式框架,其中响应式是VUE的核心特性之一,使得数据与界面保持同步,大大提高了开发效率。本文将阐述VUE响应式原理的实现,帮助读者更加深入理解VUE框架。 数据劫持 VUE的响应式实现依赖于ES5的get和set方法。在一个对象被创建时,遍历对象上的所有属性,将其转化为getter/setter,…

    Vue 2023年5月27日
    00
  • vue-resourc发起异步请求的方法

    下面是vue-resource发起异步请求的方法的完整攻略。 安装vue-resource 首先需要在项目中安装vue-resource: npm install vue-resource –save 然后在项目中使用vue-resource: import Vue from ‘vue’ import VueResource from ‘vue-resou…

    Vue 2023年5月28日
    00
  • vue动态绑定class的几种常用方式小结

    Vue动态绑定class的几种常用方式小结 在Vue中如何动态绑定class是一个常见问题,本篇文章将总结几种常用的方式,包括对象语法、数组语法、计算属性以及使用第三方插件来实现。同时提供具体的示例代码帮助理解。 对象语法 对象语法是动态绑定class的最常见方式之一。在Vue中可以直接使用v-bind:class指令,并在该指令对应的值中使用对象语法,如下…

    Vue 2023年5月28日
    00
  • vue.js 双层嵌套for遍历的方法详解, 类似php foreach()

    下面让我详细讲解“vue.js 双层嵌套for遍历的方法详解, 类似php foreach()”的完整攻略。 前言 在使用 Vue.js 时,经常需要做列表展示,而列表数据往往是嵌套的,比如订单列表,订单中包含多个商品,那么就需要双层嵌套 for 循环遍历。本文将详细介绍使用 Vue.js 双层嵌套 for 循环遍历的方法。 方法一:使用 v-for 指令嵌…

    Vue 2023年5月29日
    00
  • 浅谈Vue2.0中v-for迭代语法的变化(key、index)

    浅谈Vue2.0中v-for迭代语法的变化(key、index) 传统的v-for迭代语法 Vue 1.x和2.x在v-for指令上有一些差异,Vue 1.x中v-for迭代语法支持以下形式: <div v-for="item in items"> {{ item }} </div> 在Vue 1.x中,v-for…

    Vue 2023年5月28日
    00
  • vue2.0使用Sortable.js实现的拖拽功能示例

    实现拖拽功能是现代Web应用中常见的需求之一,而Vue.js是目前最受欢迎的JavaScript框架之一。在Vue.js中,我们可以使用第三方库Sortable.js来完成拖拽功能的实现。 下面是实现“vue2.0使用Sortable.js实现的拖拽功能示例”的攻略: 准备工作 使用Vue CLI创建一个新的Vue.js项目。 bash vue create…

    Vue 2023年5月29日
    00
  • vue在取对象长度length时候出现undefined的解决

    当使用Vue框架的语法时,在某些情况下从一个对象中获取其长度属性时,可能会返回undefined。这通常是由于Vue对象中有未定义的属性造成的。下面是解决这种问题的方法。 方法一:使用计算属性 我们可以使用计算属性来获取Vue对象的长度。通过计算属性,我们可以遍历对象并返回正确的长度。 <template> <div>{{ objec…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部