最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 如何优雅在vue3中编写命令式Confirm组件

    正文概述 掘金(DengChao)   2021-03-31   682

    在编写7享项目的时候,我发现一个编写问题,就是我的自定义弹窗组件会在项目中会多次重复调用,并且使用起来不方便。比如我使用组件的地方要先import组件进来,组件注册,再然后给组件加ref引用,最后调用组件的方法来控制状态。那有什么办法可以通过简单方式来调用自己的组件了呢? 答案是有的,我们直接通过命令式来调用组件,而无需别的操作。也就是这样调用:

    this.$success()
    

    没有import,没有ref,没有组件注册,这样就能调用自己的组件,是不是更方便了。

    编写组件

    写出组件(完整代码放在我的github仓,这里以success组件为例)

    const Success = {
      name: 'success',
      inject: ['text']
    }
    export default Success
    

    编写根节点

    let root = document.createElement('div')
    root.setAttribute('id', 'my')
    

    挂载组件

    const DEFAULT = '成功'
    import {createApp} from 'vue'
    
    let instanceCache;
    function mountComponent(arg) {
      if (!instanceCache) {
        instanceCache = createApp(Success) // 构建应用上下文的应用实例
        let text = arg[0]?arg[0]:DEFAULT
        instanceCache.provide('text', text) // 外部注入到组件的值
        document.body.appendChild(root); // 本根节点添加到body
        instanceCache.mount('#my') // 挂载组件
      }
    }
    

    编写调用函数

    const INTERVAL = 3500
    export const success = function () {
      let arg = arguments
      mountComponent(arg)
      setTimeout(() => {
        instanceCache.unmount(root);
        document.body.removeChild(root);
        instanceCache = ''
      }, INTERVAL)
    }
    

    编写调用命令

    import {createApp} from "vue";
    import {success} from './plugin/success'
    import App from "./App";
    const app = createApp(App)
    app.config.globalProperties.$success = success
    

    这写法看上去没啥问题,但这方法每次调用自己的组件,都要这样 import一次自己的组件,这显然不是我想要的。那有什么办法可以自动帮我导入组件,并且实现组件的命令式的自定义呢?

    简单来说,可以通过该属性可以获取到放在指定范围内满足条件的文件。

    我利用该属性可以获取到指定文件夹内的自定义好的插件信息,通过collectPlugins.keys()获取到的文件数组来遍历实现文件的命令式api注册.

    // 收集在文档中所有插件
    const collectPlugins = require.context('./plugin', true, /.vue$/)
    
    export const createAPI = (app) => {
        collectPlugins.keys().forEach(file_name => {
            // 拿到每个组件的name值,这要求每个组件都要设置name
            let fileName = collectPlugins(file_name).default.name
            // 检测组件内是否有命名name
            if (fileName===undefined ||fileName === '' ){
                throw '请设置组件的名字'
            }
            // 检测组件内的名字是否与组件的命名是否一致
            if (file_name.match(/([A-Za-z]+)/g)[0]!= fileName) {
                throw fileName + '组件里面的name与组件命名不一致'
            }
            // 注册
            let fn = collectPlugins(file_name)[fileName]
            let api = '$' + fileName
            app.config.globalProperties[api] = fn
        })
    }
    

    运行

    将函数 createAPI() 导入至vue入口文件 main.js

    import { createApp } from 'vue'
    import {createAPI} from "./plugin";
    import App from './App.vue'
    const app = createApp(App)
    createAPI(app)
    

    最后

    演示网址:www.ifenghua.top/mobile ,该项目基于vue3建立,大伙可自行注册账号和密码后方可使用。

    github:github.com/dengguochao…

    最后,大伙别忘给个star呗,您的star是我创造最大的动力。


    起源地下载网 » 如何优雅在vue3中编写命令式Confirm组件

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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