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+iview实现分页及查询功能
Nov 17 Vue.js
详解vue-cli项目在IE浏览器打开报错解决方法
Dec 10 Vue.js
vue+element实现动态加载表单
Dec 13 Vue.js
梳理一下vue中的生命周期
Dec 30 Vue.js
Vue 修改网站图标的方法
Dec 31 Vue.js
vue.js watch经常失效的场景与解决方案
Jan 07 Vue.js
vue中h5端打开app(判断是安卓还是苹果)
Feb 26 Vue.js
vue实现可移动的悬浮按钮
Mar 04 Vue.js
vue3.0中使用element的完整步骤
Mar 04 Vue.js
vue Element-ui表格实现树形结构表格
Jun 07 Vue.js
vue实现可以快进后退的跑马灯组件
Apr 08 Vue.js
Vue深入理解插槽slot的使用
Aug 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中使用接口实现工厂设计模式的代码
2012/06/17 PHP
PHP的pcntl多进程用法实例
2015/03/19 PHP
完美解决thinkphp唯一索引重复时出错的问题
2017/03/31 PHP
PHP+Session防止表单重复提交的解决方法
2018/04/09 PHP
PHP优化之批量操作MySQL实例分析
2020/04/23 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
JQUERY复选框CHECKBOX全选,取消全选
2008/08/30 Javascript
使用基于jquery的gamequery插件做JS乒乓球游戏
2011/07/31 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
2014/10/19 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
2016/08/01 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
JS对象和字符串之间互换操作实例分析
2019/02/02 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
JavaScript实现简单计算器
2020/03/19 Javascript
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
Python编程实现的简单Web服务器示例
2017/06/22 Python
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
Python中property函数用法实例分析
2018/06/04 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
2020/05/23 Python
keras得到每层的系数方式
2020/06/15 Python
python 解决selenium 中的 .clear()方法失效问题
2020/09/01 Python
英国男女奢华内衣和泳装购物网站:Figleaves
2017/01/28 全球购物
马来西亚网上购物平台:ezbuy
2018/02/13 全球购物
彪马加拿大官网:PUMA加拿大
2018/10/04 全球购物
什么是GWT的Module
2013/01/20 面试题
房地产销售计划书
2014/01/10 职场文书
运动会邀请函范文
2014/02/06 职场文书
2015年考研复习计划
2015/01/19 职场文书
探究Mysql模糊查询是否区分大小写
2021/06/11 MySQL