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开发chrome插件,实现获取界面数据和保存到数据库功能
Dec 01 Vue.js
对vue生命周期的深入理解
Dec 03 Vue.js
vue基于Echarts的拖拽数据可视化功能实现
Dec 04 Vue.js
vue项目如何监听localStorage或sessionStorage的变化
Jan 04 Vue.js
Vue实现多页签组件
Jan 14 Vue.js
vue 计算属性和侦听器的使用小结
Jan 25 Vue.js
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 07 Vue.js
Vue中避免滥用this去读取data中数据
Mar 02 Vue.js
vue组件的路由高亮问题解决方法
May 11 Vue.js
Vue项目打包、合并及压缩优化网页响应速度
Jul 07 Vue.js
vue 数字翻牌器动态加载数据
Apr 20 Vue.js
vue @ ~ 相对路径 路径别名设置方式
Jun 05 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
PHP使用CURL模拟登录的方法
2015/07/08 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
php读取txt文件并将数据插入到数据库
2016/02/23 PHP
jQuery对象和DOM对象使用说明
2010/06/25 Javascript
jquery下利用jsonp跨域访问实现方法
2010/07/29 Javascript
ie下动态加态js文件的方法
2011/09/13 Javascript
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
js实现获取div坐标的方法
2015/11/16 Javascript
JavaScript匿名函数之模仿块级作用域
2015/12/12 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
如何利用Promises编写更优雅的JavaScript代码
2016/05/17 Javascript
Node.js 数据加密传输浅析
2016/11/16 Javascript
微信小程序中的swiper组件详解
2017/04/14 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
2018/02/12 jQuery
用VsCode编辑TypeScript的实现方法
2020/05/07 Javascript
python模块之time模块(实例讲解)
2017/09/13 Python
python 实现一个贴吧图片爬虫的示例
2017/10/12 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
Python之多线程爬虫抓取网页图片的示例代码
2018/01/10 Python
浅述python2与python3的简单区别
2018/09/19 Python
django ModelForm修改显示缩略图 imagefield类型的实例
2019/07/28 Python
安装完Python包然后找不到模块的解决步骤
2020/02/13 Python
Python + selenium + crontab实现每日定时自动打卡功能
2020/03/31 Python
HTML5实现动画效果的方式汇总
2016/02/29 HTML / CSS
澳洲健康食品网上商店:Aussie Health Products
2018/06/15 全球购物
CheapTickets香港机票预订网站:CheapTickets.hk
2019/06/26 全球购物
欧洲最古老的鞋厂:Peter Kaiser
2019/11/05 全球购物
遗产继承公证书
2014/04/09 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
特此通知格式
2015/04/27 职场文书