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实现指令式动态追加小球动画组件的步骤
Dec 18 Vue.js
Vue实现一种简单的无限循环滚动动画的示例
Jan 10 Vue.js
Vue仿Bibibili首页的问题
Jan 21 Vue.js
如何在vue中使用video.js播放m3u8格式的视频
Feb 01 Vue.js
如何让vue长列表快速加载
Mar 29 Vue.js
vue前端工程的搭建
Mar 31 Vue.js
详解vue身份认证管理和租户管理
May 25 Vue.js
Vue+Element UI实现概要小弹窗的全过程
May 30 Vue.js
vue基于Teleport实现Modal组件
May 31 Vue.js
VUE之图片Base64编码使用ElementUI组件上传
Apr 09 Vue.js
关于vue-router-link选择样式设置
Apr 30 Vue.js
vue使用watch监听属性变化
Apr 30 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 字符串长度判断效率更高的方法
2014/03/02 PHP
php多次include后导致全局变量global失效的解决方法
2015/02/28 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
Javascript读取cookie函数代码
2010/10/16 Javascript
jQuery获取地址栏参数插件(模仿C#)
2010/10/26 Javascript
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
2013/07/28 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
通过bootstrap全面学习less
2016/11/09 Javascript
js+div+css下拉导航菜单完整代码分享
2016/12/28 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
angular5 httpclient的示例实战
2018/03/12 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
2018/05/01 Javascript
基于vue-upload-component封装一个图片上传组件的示例
2018/10/16 Javascript
js实现图片放大并跟随鼠标移动特效
2019/01/18 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
详细介绍Python中的偏函数
2015/04/27 Python
Python使用ntplib库同步校准当地时间的方法
2016/07/02 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
更新升级python和pip版本后不生效的问题解决
2020/04/17 Python
Python列表如何更新值
2020/05/27 Python
Python通过类的组合模拟街道红绿灯
2020/09/16 Python
Python从MySQL数据库中面抽取试题,生成试卷
2021/01/14 Python
python爬取2021猫眼票房字体加密实例
2021/02/19 Python
利用CSS3的transform做的动态时钟效果
2011/09/21 HTML / CSS
新西兰床上用品和家居用品购物网站:Adairs
2018/04/27 全球购物
size?爱尔兰官方网站:英国伦敦的球鞋精品店
2019/03/31 全球购物
简单介绍Object类的功能、常用方法
2013/10/02 面试题
我的教育故事演讲稿
2014/05/04 职场文书
敬老院献爱心活动总结
2014/07/08 职场文书
简易离婚协议书范本2014
2014/10/15 职场文书
考试作弊万能检讨书
2014/10/19 职场文书