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

下面我来详细讲解“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 MVVM模型超详细讲解

    Vue MVVM模型超详细讲解 什么是MVVM模型 MVVM模型是Model-View-ViewModel的缩写,是一种前端框架中常用的设计模式。 Model: 数据模型层,提供数据的操作方法; View: 展示层,使用HTML和CSS实现用户界面; ViewModel: 数据绑定层,将View和Model进行双向数据绑定。ViewModel会监听View层…

    Vue 2023年5月27日
    00
  • 15个Vue技巧,你都知道吗

    15个Vue技巧,你都知道吗 本篇攻略将讲解15个Vue的技巧,旨在提高您的Vue开发效率。 技巧一:使用v-for循环时,给每一项设置key 在使用v-for循环时,需要给每一项设置一个唯一的key值,以便在更新数据时能够快速定位需要更新的元素,否则会出现性能问题。 <template> <ul> <li v-for=&quo…

    Vue 2023年5月27日
    00
  • Vue.JS项目中5个经典Vuex插件

    下面我将详细讲解“Vue.JS项目中5个经典Vuex插件”的完整攻略。 1. 简介 Vuex 作为 Vue.js 的一个官方库,提供了维护和管理应用程序状态的工具集。它实现了 Flux 设计模式,与 Vue.js 的实例的完整性和响应式特性集成在了一起,帮助我们更好地管理Vue.js应用程序中的数据流。 Vuex 提供了大量插件,以扩展 Vuex 的功能。V…

    Vue 2023年5月27日
    00
  • Vue官网todoMVC示例代码

    下面是Vue官网todoMVC示例代码的完整攻略。 1. 前置知识 在学习todoMVC示例代码之前,你需要先了解以下知识: Vue.js框架的基本语法和使用方式; JavaScript的基础语法; HTML和CSS的基础语法; todoMVC是什么以及它的主要功能。 2. 代码结构 Vue官网的todoMVC示例共包含4个文件,分别是: index.htm…

    Vue 2023年5月28日
    00
  • vue3 Composition API使用示例教程

    让我来分享一下关于“Vue3 Composition API使用示例教程”的完整攻略。 什么是Composition API? Composition API 是 Vue.js 3.x 中一种全新的 API 形式,它允许我们通过一个新的代码组织方式来组织我们的 Vue 组件。使用 Composition API,我们可以通过功能切分的思路更好地组织代码,并更…

    Vue 2023年5月28日
    00
  • SpringBoot+Vue.js实现前后端分离的文件上传功能

    以下是”SpringBoot+Vue.js实现前后端分离的文件上传功能”的完整攻略: 1. 前置条件 已安装好Java开发环境和Maven构建工具 已创建好一个基于SpringBoot的Web项目 已安装好Vue.js前端框架 2. 实现后端文件上传功能 2.1. 添加Multipart依赖 在项目的pom.xml文件中添加Multipart依赖: <…

    Vue 2023年5月28日
    00
  • Vue.js directive自定义指令详解

    Vue.js directive自定义指令是Vue.js框架提供的一个强大的功能,可以让我们自定义Vue实例的行为。下面我将为大家详细讲解“Vue.js directive自定义指令详解”完整攻略。 一. Vue.js directive自定义指令详解 在Vue.js中,我们可以通过Vue.directive()方法来自定义指令。该方法接收两个参数:指令的名…

    Vue 2023年5月28日
    00
  • vue编写的功能强大的swagger-ui页面及使用方式

    什么是Swagger-UI页面? Swagger UI是一个通过注解的方式为 RESTful API 描述文档生成在线文档界面的工具。通过Swagger UI,我们可以详细地查看到API接口的信息,包括接口名称、接口描述、请求地址、请求方式、参数类型、参数描述、响应状态码等等。Swagger UI可以很方便地帮助我们对API接口进行测试与调试。 如何使用Vu…

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