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.0中友好使用antdv示例详解
Jan 05 Vue.js
通过vue.extend实现消息提示弹框的方法记录
Jan 07 Vue.js
vue实现简易计算器功能
Jan 20 Vue.js
vue 动态添加的路由页面刷新时失效的原因及解决方案
Feb 26 Vue.js
详解vue3中组件的非兼容变更
Mar 03 Vue.js
Vue详细的入门笔记
May 10 Vue.js
Vue通过懒加载提升页面响应速度
May 10 Vue.js
Vue组件更新数据v-model不生效的解决
Apr 02 Vue.js
分享一个vue实现的记事本功能案例
Apr 11 Vue.js
使用vue判断当前环境是安卓还是IOS
Apr 12 Vue.js
vue的项目如何打包上线
Apr 13 Vue.js
Vue router配置与使用分析讲解
Dec 24 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学习 字符串课件
2008/06/15 PHP
PHP实现登陆表单提交CSRF及验证码
2017/01/24 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
javascript 隔行换色函数代码
2010/10/24 Javascript
jquery插件开发方法(初学者)
2012/02/03 Javascript
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
2014/11/28 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
使用pcs api往免费的百度网盘上传下载文件的方法
2016/03/17 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
JavaScript实现数值自动增加动画
2017/12/28 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
react实现点击选中的li高亮的示例代码
2018/05/24 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
2019/01/05 jQuery
three.js利用gpu选取物体并计算交点位置的方法示例
2019/11/25 Javascript
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
使用PYTHON创建XML文档
2012/03/01 Python
Windows下安装python2和python3多版本教程
2017/03/30 Python
python中子类调用父类函数的方法示例
2017/08/18 Python
django admin组件使用方法详解
2019/07/19 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
2020/01/03 Python
pytorch对梯度进行可视化进行梯度检查教程
2020/02/04 Python
django中related_name的用法说明
2020/05/20 Python
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
新秀丽官方旗舰店:Samsonite拉杆箱、双肩包、皮具
2018/03/05 全球购物
抽象方法、抽象类怎样声明
2014/10/25 面试题
Overload和Override的区别
2012/09/02 面试题
数控技术专业推荐信
2013/11/01 职场文书
《问银河》教学反思
2014/02/19 职场文书
爱护公物标语
2014/06/24 职场文书
夫妻双方自愿离婚协议书怎么写
2014/12/01 职场文书
go语言求任意类型切片的长度操作
2021/04/26 Golang
在Django中使用MQTT的方法
2021/05/10 Python
python基础之文件操作
2021/10/24 Python
Vue Element plus使用方法梳理
2022/12/24 Vue.js