最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • vue3.0是如何实现插件封装的?

    正文概述 掘金(慕斯不想说话)   2020-12-13   1317

      最近公司有一个新的项目,项目框架是我来负责搭建的,所以果断选择了Vue3.x+tsvue3.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是如何实现插件封装的?

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元