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实现插件封装
Dec 14 Vue.js
vue el-upload上传文件的示例代码
Dec 21 Vue.js
vue 实现图片懒加载功能
Dec 31 Vue.js
vue3.0中友好使用antdv示例详解
Jan 05 Vue.js
vue+element table表格实现动态列筛选的示例代码
Jan 14 Vue.js
vue-resource 拦截器interceptors使用详解
Jan 18 Vue.js
如何在vue 中使用柱状图 并自修改配置
Jan 21 Vue.js
vue 实现click同时传入事件对象和自定义参数
Jan 29 Vue.js
Vue项目打包部署到apache服务器的方法步骤
Feb 01 Vue.js
手写Vue2.0 数据劫持的示例
Mar 04 Vue.js
详解vue身份认证管理和租户管理
May 25 Vue.js
vue实现input输入模糊查询的三种方式
Aug 14 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
通过5个php实例细致说明传值与传引用的区别
2012/08/08 PHP
用PHP的反射实现委托模式的讲解
2019/03/22 PHP
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
jQuery入门知识简介
2010/03/04 Javascript
javascript真的不难-回顾一下基础知识
2013/01/15 Javascript
jQuery动态添加删除select项(实现代码)
2013/09/03 Javascript
js正则表达exec与match的区别说明
2014/01/29 Javascript
Js实现简单的小球运动特效
2016/02/18 Javascript
干货!教大家如何选择Vue和React
2017/03/13 Javascript
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
微信小程序自定义音乐进度条的实例代码
2018/08/28 Javascript
Bootstrap-table使用footerFormatter做统计列功能
2018/09/07 Javascript
python和shell实现的校验IP地址合法性脚本分享
2014/10/23 Python
Python列表计数及插入实例
2014/12/17 Python
Python列表切片操作实例总结
2019/02/19 Python
在Python中如何传递任意数量的实参的示例代码
2019/03/21 Python
Python数据类型之String字符串实例详解
2019/05/08 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
h5页面唤起app如果没安装就跳转下载(iOS和Android)
2020/06/03 HTML / CSS
C++:memset ,memcpy和strcpy的根本区别
2013/04/27 面试题
Javascript如何发送一个Ajax请求
2015/01/26 面试题
为什么需要版本控制
2016/10/28 面试题
J2EE中的容器都包括哪些
2013/08/21 面试题
护士自我鉴定
2013/10/23 职场文书
英语专业毕业生自荐信范文
2013/12/31 职场文书
教师党员思想汇报
2014/01/06 职场文书
30年同学聚会感言
2014/01/30 职场文书
面试后感谢信怎么写
2014/02/01 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
2014年教师政治学习材料
2014/06/02 职场文书
关爱残疾人标语
2014/06/25 职场文书
创先争优演讲稿
2014/09/15 职场文书
乡镇干部学习心得体会
2016/01/23 职场文书
MySQL读取JSON转换的方式
2022/03/18 MySQL