返回顶部
首页 > 资讯 > 精选 >怎么封装一个更易用的Dialog组件
  • 691
分享到

怎么封装一个更易用的Dialog组件

2023-06-30 14:06:53 691人浏览 安东尼
摘要

这篇“怎么封装一个更易用的Dialog组件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么封装一个更易用的Dialog组件

这篇“怎么封装一个更易用的Dialog组件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么封装一个更易用的Dialog组件”文章吧。

    场景

    项目中,我们经常会遇到使用弹窗的场景,但有时组件库自带的弹窗不能满足我们的需求,需要我们自己封装,这时我们如何去自定义一个更加方便调用的弹窗?

    搭建环境

    首先我们需要搭建一个vue3+ts的环境。

    用vite的官方模板:

    yarn create vite demo-app --template Vue-ts

    进入并安装依赖

    cd demo-appyarn

    依赖安装完成后启动app

    yarn dev

    创建组件

    先在src/components目录下创建MyDialog.vue,搭建一个组件的基本框架

    <script lang="ts" setup>import { ref, Reactive } from "vue";defineProps({  message: {    type: String,    default: "",  },  title: {    type: String,    default: "",  },});const emits = defineEmits<{  (e: "confirm"): void;  (e: "close"): void;}>();const visible = ref(true);function clickConfirm() {  console.log("确认");  emits("confirm");}function clickClose() {  console.log("取消");  emits("close");}</script><template>  <div class="wrap" v-if="visible">    <div class="container">      <div class="title">{{ title }}</div>      <div class="content">        <div>{{ message }}</div>      </div>      <div class="controll">        <button @click="clickConfirm">确认</button>        <button @click="clickClose">取消</button>      </div>    </div>  </div></template><style scoped>.wrap {  position: absolute;  top: 0;  left: 0;  background: rgba(15, 15, 15, 0.5);  width: 100%;  height: 100%;}.container {  position: absolute;  top: 50%;  left: 50%;  transfORM: translate(-50%, -50%);  min-width: 300px;  min-height: 200px;  padding: 10px;  background: white;  display: flex;  flex-direction: column;}.content {  flex: 1;  padding: 10px;  text-align: left;}.title {  min-height: 30px;}.controll {  display: flex;  width: 100%;  justify-content: space-around;}</style>

    创建调用组件的hook函数

    在src目录下创建hooks目录,然后再hooks目录下创建useMyDialog.ts.

    函数调用组件我们需要:

    • 将组件转换成Vnode

    • 将VNode转换成DOM然后渲染到页面

    import { createVNode, render, ComponentPublicInstance } from "vue";export default function useMyDialog(option?: any) {  const props = {    ...option,  };  const vm = createVNode(MyDialog, props);  const container = document.createElement("div");  render(vm, container);  document.querySelector("#app")?.appendChild(container.firstElementChild!);}

    ps:

    container.firstElementChild!中的!表示container.firstElementChild不为null或者undefined

    接下来我们在App.vue中测试一下

    <script setup lang="ts">import useMyDialog from "./hooks/useMyDialog";function showDialog() {  useMyDialog({    message: "test1",    onClose: () => {      console.log("self");    },  });}</script><template>  <button @click="showDialog">显示Dialog</button></template>

    怎么封装一个更易用的Dialog组件

    Dialog的缓存、隐藏

    隐藏

    我们需要将close返回出去,这样我们就可以手动调用close函数关闭Dialog.

    在useMyDialog.ts中添加

    import { ComponentPublicInstance,VNode } from "vue";export default function useMyDialog(option?: any) {  const userCloseFn = option?.onClose;  props.onClose = () =&gt; {    close();    userCloseFn ?? userCloseFn();  };  function close(vm: VNode) {    (      vm.component!.proxy as ComponentPublicInstance&lt;{ visible: boolean }&gt;    ).visible = false;  }  return {    close: close.bind(null, vm),  }}

    缓存

    怎么封装一个更易用的Dialog组件

    现在每次点击显示Dialog按钮时都会创建一个新的组件实例,这不是我们的预期,所以我们需要将组件进行缓存.

    在useMyDialog.ts中添加

    import { ComponentPublicInstance } from 'vue'const instances: any[] = [];export default function useMyDialog(option?: any) {  const tempVm: any = instances.find(    (item) =>      `${item.vm.props?.message ?? ""}` === `${(option as any).message ?? ""}`  );  if (tempVm) {    (      tempVm.vm.component!.proxy as ComponentPublicInstance<{        visible: boolean;      }>    ).visible = true;    return {      close: close.bind(null, tempVm.vm),    };  }}

    完整代码

    src/hooks/useMyDialog.ts

    import { createVNode, render, ComponentPublicInstance, VNode } from "vue";import MyDialog from "../components/MyDialog.vue";const instances: any[] = [];export default function useMyDialog(option?: any) {  const props = {    ...option,  };  const userCloseFn = option?.onClose;  props.onClose = () => {    close(vm);    userCloseFn ?? userCloseFn();  };  function close(vm: VNode) {    (      vm.component!.proxy as ComponentPublicInstance<{ visible: boolean }>    ).visible = false;  }  const tempVm: any = instances.find(    (item) =>      `${item.vm.props?.message ?? ""}` === `${(option as any).message ?? ""}`  );  if (tempVm) {    (      tempVm.vm.component!.proxy as ComponentPublicInstance<{        visible: boolean;      }>    ).visible = true;    return {      close: close.bind(null, tempVm.vm),    };  }  const vm = createVNode(MyDialog, props);  const container = document.createElement("div");  render(vm, container);  document.querySelector("#app")?.appendChild(container.firstElementChild!);  instances.push({ vm });  return {    close: close.bind(null, vm),  };}

    以上就是关于“怎么封装一个更易用的Dialog组件”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

    --结束END--

    本文标题: 怎么封装一个更易用的Dialog组件

    本文链接: https://lsjlt.com/news/329641.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • 怎么封装一个更易用的Dialog组件
      这篇“怎么封装一个更易用的Dialog组件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么封装一个更易用的Dialog组件...
      99+
      2023-06-30
    • 封装一个更易用的Dialog组件过程详解
      目录场景搭建环境创建组件创建调用组件的hook函数Dialog的缓存、隐藏隐藏缓存完整代码总结场景 在项目中,我们经常会遇到使用弹窗的场景,但有时组件库自带的弹窗不能满足我们的需求,...
      99+
      2024-04-02
    • Vue中怎么对ElementUI的Dialog组件封装
      本篇内容主要讲解“Vue中怎么对ElementUI的Dialog组件封装”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue中怎么对ElementUI的Dialog组件封装”吧!对Element...
      99+
      2023-07-05
    • Vue中如何对ElementUI的Dialog组件封装
      目录对ElementUI的Dialog组件封装.sync 修饰符说明总结对ElementUI的Dialog组件封装 1.子组件的写法 <el-dialog     title=...
      99+
      2023-03-11
      Vue ElementUI Dialog组件封装 Vue ElementUI封装
    • Angular中怎么封装一个并发布组件
      本篇文章为大家展示了Angular中怎么封装一个并发布组件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、封装组件目录结构:(部分目录不是框架中自动生成,二是后期...
      99+
      2024-04-02
    • vue中怎么封装一个弹出框组件
      这期内容当中小编将会给大家带来有关vue中怎么封装一个弹出框组件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.你需要先建一个弹出框的模板://首先创建一个mack.v...
      99+
      2024-04-02
    • 开发一个封装iframe的vue组件
      目录一、组件介绍 二、组件内部结构及逻辑 1、代码组织结构2、地图组件三、iframe接口 四、外部接口 五、运行结果六、总结 VUE的基本组成单元,我看应该是组件。用VUE开发前端...
      99+
      2024-04-02
    • 利用Android封装一个有趣的Loading组件
      目录前言组件定义圆形Loading椭圆运动Loading贝塞尔曲线Loading组件使用总结前言 在上一篇普通的加载千篇一律,有趣的 loading 万里挑一 中,我们介绍了使用Pa...
      99+
      2022-11-13
      Android封装Loading组件 Android Loading组件 Android Loading
    • vue中使用render封装一个select组件
      目录使用render封装一个select组件vue另类封装--render函数封装先看看文件的结构render函数封装使用render封装一个select组件 父组件 val...
      99+
      2024-04-02
    • 怎么封装一个vue自定义日历组件
      这篇文章主要介绍“怎么封装一个vue自定义日历组件”,在日常操作中,相信很多人在怎么封装一个vue自定义日历组件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么封装一个vue自定义日历组件”的疑惑有所帮助!...
      99+
      2023-07-05
    • vue封装一个弹幕组件详解
      目录前言功能实现1、获取随机颜色随机数生成随机颜色编码生成2、随机生成弹幕出现的高度坐标3、格式化弹幕对象颜色定位4、创建弹幕对象滚动动画定义创建弹幕dom对象实例弹幕销毁弹幕循环5...
      99+
      2022-11-13
      vue封装弹幕组件 vue封装组件
    • 你知道怎么基于 React 封装一个组件吗
      目录antd 是如何封装组件的仓库地址divider 组件源代码如何暴露组件属性如何设置统一类名前缀如何处理样式与类名divider 组件样式源代码总结前言 很多小伙伴在第一次尝试封...
      99+
      2024-04-02
    • 如何开发一个封装iframe的vue组件
      这篇文章给大家分享的是有关如何开发一个封装iframe的vue组件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。VUE的基本组成单元,我看应该是组件。用VUE开发前端项目,就是开发一个个组件,然后搭积木一样,将项...
      99+
      2023-06-14
    • vue 封装一个高质量的表单通用组件
      目录正文基于Element-plus实现二次封装表单组件步骤1步骤2富文本表单项封装上传表单项封装同行多个表单布局封装步骤3总结正文 我们都知道表单组件应该是后台管理系统中用得最多...
      99+
      2023-03-10
      vue 封装表单通用组件 vue 封装表单
    • 基于React封装一个组件的方法是什么
      这篇文章主要讲解了“基于React封装一个组件的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于React封装一个组件的方法是什么”吧!antd 是如何封装组件的仓库地址divi...
      99+
      2023-06-29
    • 详解怎么使用vue封装一个自定义日历组件
      执行这个方法之后,此时calendarProps的值为:4、根据日历属性生成日历日期的数据当我们已经知道本月第一天对应的周几索引值、本月一共有多少天和上个月一共有多少天这三个核心数据之后,就可以开始生成对应的日历数据了。思路如下:由于大部分...
      99+
      2023-05-14
      Vue.js 数据可视化 前端
    • 利用Vue3封装一个弹框组件简单吗
      目录总结放前面: 前言:公共全局弹框结语:总结放前面: Tipes: 封装弹框组件使用了Teleport,避免了组件嵌套可能导致的定位层级的隐患,还使用了defineProps,de...
      99+
      2024-04-02
    • vue封装一个图案手势锁组件
      目录说在前面效果展示预览地址实现步骤1.组件设计2.组件分析3.组件实现4.组件使用组件库引用源码地址组件文档说在前面 现在很多人都喜欢使用图案手势锁,这里我使用vue来封装了一个可...
      99+
      2024-04-02
    • Vue3怎么封装组件
      这篇文章主要讲解了“Vue3怎么封装组件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue3怎么封装组件”吧!例如我们在使用element的标签页tabs组件时,如下图所示:tabs组件可...
      99+
      2023-07-05
    • vue中怎么封装一个webSQL插件
      这篇文章主要讲解了“vue中怎么封装一个webSQL插件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue中怎么封装一个webSQL插件”吧!需求先理清需求,而后才好有个目标。数据库的初始...
      99+
      2023-07-04
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作