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 相关文章推荐
深入了解Vue3模板编译原理
Nov 19 Vue.js
vue+element实现动态加载表单
Dec 13 Vue.js
基于VUE实现简单的学生信息管理系统
Jan 13 Vue.js
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 Vue.js
Vue2.x-使用防抖以及节流的示例
Mar 02 Vue.js
vue首次渲染全过程
Apr 21 Vue.js
vue完美实现el-table列宽自适应
May 08 Vue.js
如何使用vue3打造一个物料库
May 08 Vue.js
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
Jun 09 Vue.js
详解Vue router路由
Nov 20 Vue.js
Vue h函数的使用详解
Feb 18 Vue.js
vue实现滑动解锁功能
Mar 03 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
重料打造自己的“宝马”---第三代
2021/03/02 无线电
PHP数字格式化
2006/12/06 PHP
PHP XML error parsing SOAP payload on line 1
2010/06/17 PHP
Yii框架getter与setter方法功能与用法分析
2019/10/22 PHP
css3实现背景模糊的三种方式
2021/03/09 HTML / CSS
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
jquery 实现两级导航菜单附效果图
2014/03/07 Javascript
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
2014/12/15 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
2015/03/24 Javascript
JavaScript事件委托实例分析
2015/05/26 Javascript
javascript常用的方法整理
2015/08/20 Javascript
js操作数据库实现注册和登陆的简单实例
2016/05/26 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
vue组件中使用iframe元素的示例代码
2017/12/13 Javascript
Vue父组件调用子组件事件方法
2018/02/23 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
Node.js动手撸一个静态资源服务器的方法
2019/03/09 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
[39:53]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.19
2020/11/19 DOTA
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
Linux中Python 环境软件包安装步骤
2016/03/31 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
详解Python中的正则表达式
2018/07/08 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
2019/01/29 Python
Dlib+OpenCV深度学习人脸识别的方法示例
2019/05/14 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
基于梯度爆炸的解决方法:clip gradient
2020/02/04 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
质检员岗位职责
2015/02/03 职场文书
2019年“我为祖国点赞”演讲稿(3篇)
2019/09/26 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android