vue3.0实现插件封装


Posted in Vue.js onDecember 14, 2020

  最近公司有一个新的项目,项目框架是我来负责搭建的,所以果断选择了Vue3.x+ts。vue3.x不同于vue2.x,他们两的插件封装方式完全不一样。由于项目中需要用到自定义提示框,所以想着自己封装一个。vue2.x提供了一个vue.extend的全局方法。那么vue3.x是不是也会提供什么方法呢?果然从vue3.x源码中还是找到了。插件封装的方法,还是分为两步。

1、组件准备

  按照vue3.x的组件风格封装一个自定义提示框组件。在props属性中定义好。需要传入的数据流。

<template>
  <div v-show="visible" class="model-container">
   <div class="custom-confirm">
    <div class="custom-confirm-header">{{ title }}</div>
    <div class="custom-confirm-body" v-html="content"></div>
    <div class="custom-confirm-footer">
     <Button @click="handleOk">{{ okText }}</Button>
     <Button @click="handleCancel">{{ cancelText }}</Button>
    </div>
   </div>
  </div>
</template>
<script lang="ts">
import { defineComponent, watch, reactive, onMounted, onUnmounted, toRefs } from "vue";
export default defineComponent({
 name: "ElMessage",
 props: {
  title: {
   type: String,
   default: "",
  },
  content: {
   type: String,
   default: "",
  },
  okText: {
   type: String,
   default: "确定",
  },
  cancelText: {
   type: String,
   default: "取消",
  },
  ok: {
   type: Function,
  },
  cancel: {
   type: Function,
  },
 },
 setup(props, context) {
  const state = reactive({
   visible: false,
  });
  function handleCancel() {
   state.visible = false;
   props.cancel && props.cancel();
  }
  function handleOk() {
   state.visible = false;
   props.ok && props.ok();
  }
  return {
   ...toRefs(state),
   handleOk,
   handleCancel,
  };
 },
});
</script>

2、插件注册

  这个才是插件封装的重点。不过代码量非常少,只有那么核心的几行。主要是调用了vue3.x中的createVNode创建虚拟节点,然后调用render方法将虚拟节点渲染成真实节点。并挂在到真实节点上。本质上就是vue3.x源码中的mount操作。

import { createVNode, render } from 'vue';
import type {App} from "vue";
import MessageConstructor from './index.vue'
const body=document.body;
const Message: any= function(options:any){
 const modelDom=body.querySelector(`.container_message`)
  if(modelDom){
   body.removeChild(modelDom)
  }
  options.visible=true;
  const container = document.createElement('div')
  container.className = `container_message`
  //创建虚拟节点
  const vm = createVNode(
   MessageConstructor,
   options,
  )
  //渲染虚拟节点
  render(vm, container)
  document.body.appendChild(container);
} 
export default {
  //组件祖册
  install(app: App): void {
    app.config.globalProperties.$message = Message
  }
}

  插件封装完整地址。源码位置————packages/runtime-core/src/apiCreateApp中的createAppAPI函数中的mount方法。

vue3.0实现插件封装

vue3.0实现插件封装

以上就是vue3.0实现插件封装的详细内容,更多关于vue 插件封装的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
在Vue中使用mockjs代码实例
Nov 25 Vue.js
vue element实现表格合并行数据
Nov 30 Vue.js
用vue设计一个日历表
Dec 03 Vue.js
vue中如何自定义右键菜单详解
Dec 08 Vue.js
Vue实现指令式动态追加小球动画组件的步骤
Dec 18 Vue.js
vue实现禁止浏览器记住密码功能的示例代码
Feb 03 Vue.js
Vue中使用wangeditor富文本编辑的问题
Feb 07 Vue.js
Vue3.0写自定义指令的简单步骤记录
Jun 27 Vue.js
Vue Element-ui表单校验规则实现
Jul 09 Vue.js
Vue.js中v-for指令的用法介绍
Mar 13 Vue.js
vue+iview实现手机号分段输入框
Mar 25 Vue.js
Vue2项目中对百度地图的封装使用详解
Jun 16 Vue.js
vue 基于abstract 路由模式 实现页面内嵌的示例代码
Dec 14 #Vue.js
Vue实现点击当前行变色
Dec 14 #Vue.js
Vue实现简单购物车功能
Dec 13 #Vue.js
vue使用element-ui实现表单验证
Dec 13 #Vue.js
vue+element实现动态加载表单
Dec 13 #Vue.js
vue实现两个区域滚动条同步滚动
Dec 13 #Vue.js
vue实现滚动鼠标滚轮切换页面
Dec 13 #Vue.js
You might like
几种显示数据的方法的比较
2006/10/09 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
JQuery 操作select标签实现代码
2010/05/14 Javascript
jQuery.fn和jQuery.prototype区别介绍
2013/10/05 Javascript
javascript读取Xml文件做一个二级联动菜单示例
2014/03/17 Javascript
js点击文本框弹出可选择的checkbox复选框
2016/02/03 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
javascript中FOREACH数组方法使用示例
2016/03/01 Javascript
node.js实现爬虫教程
2020/08/25 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
jquery获取链接地址和跳转详解(推荐)
2017/08/15 jQuery
完美解决iview 的select下拉框选项错位的问题
2018/03/02 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
微信运维交互机器人的示例代码
2018/11/12 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
小程序实现短信登录倒计时
2019/07/12 Javascript
node删除、复制文件或文件夹示例代码
2019/08/13 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
修改NPM全局模式的默认安装路径的方法
2020/12/15 Javascript
python 实现插入排序算法
2012/06/05 Python
python连接池实现示例程序
2013/11/26 Python
python缩进区别分析
2014/02/15 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
2019/02/18 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
Django QuerySet查询集原理及代码实例
2020/06/13 Python
Python爬虫教程知识点总结
2020/10/19 Python
详解Canvas事件绑定
2018/06/27 HTML / CSS
Dr.Jart+美国官网:韩国药妆品牌
2019/01/18 全球购物
自行车广告词大全
2014/03/21 职场文书
小学生六年级作文之关于感恩
2019/08/16 职场文书
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL