• vue批量导入并注册全局组件


    最近博主在写大型vue项目的时候,发现有很多地方需要用到重复的组件,但又不想频繁的import再注册
    所以就把组件定义为全局组件,但是随着组件数量的越来越多,每写一个组件就要加一个全局注册方法,真的很麻烦!

    所以这里写一遍博客专门来记录vue是如何批量导入组件并注册的:

    步骤:

    • 使用 require 提供的函数 context 加载某一个目录下的所有 .vue 后缀的文件。

    • 然后 context 函数会返回一个导入函数 importFn

    • 它又一个属性 keys() 获取所有的文件路径

    • 通过文件路径数组,通过遍历数组,再使用 importFn 根据路径导入组件对象
      遍历的同时进行全局注册即可

    看的是不是有点懵,下面写的具体一点(以vue-cli为例):

    1.首先在项目的components下新建一个文件夹library,然后再library下新建index.js文件

    index.js是我们注册的入口文件,下面的vue文件就是我们准备注册的全局组件,按照以往的写法:

    import XtxSkeleton from './XtxSkeleton.vue'
    import ... from ...
    ....
    
    export default {
      install (app) {
         app.component(XtxSkeleton.name, XtxSkeleton)
         app.component(XtxMore.name, XtxMore)
         app.component(XtxBread.name, XtxBread)
         app.component(XtxBreadItem.name, XtxBreadItem)
          ...
          ...
        (每写一个组件就要再这里全局注册一下)
    }
    }
    

    然后再项目的main.js中引入入口文件,并用use方法使用

    import  UI from './src/components/library'
    
    Vue.use(UI)
    

    之后就可以再全局直接使用组件而不用导入再注册!

    批量导入

    首先介绍一些require.context方法:
    可以看一下官方文档:https://www.npmjs.com/package/require-context
    我这里简单介绍一下:

    require.context(directory, useSubdirectories = false, regExp = /^.//)
    一共接收三个参数:1.传入搜索的目录 2.一个Boolean值,表示是否加载子目录 3.一个正则表达式
    
    返回值:一个函数,有一个keys属性,这个属性为一个函数,返回值为匹配到的路径数组
    


    这里是不是还是有点懵,下面来改造一个上面的代码:

    const importFn = require.context('./', false, /.vue$/)
    export default {
      install (app) {
        importFn.keys().forEach(path => {
          const component = importFn(path).default
          app.component(component.name, component)
        })
      }
    }
    

    哇,突然代码少了很多,怎么做到的,下面来分析一下:

    const importFn = require.context('./', false, /.vue$/)
    这段代码表示匹配./路径下,以vue结尾的文件,并且不加载子目录
    

    然后我们打印一下importFn.keys()

    看,它是一个数组,里面都是匹配到的路径,然后遍历这个数组
    importFn函数接受一个路径,可以读取该路径组件的信息(别忘了后面有个.default),

    最后使用app.component方法注册组件!!!

    是不是很好用!以后在这个路径下写的所有vue文件都相当于全局注册了组件,哪里都可以用!

    注意

    1.注册组件需要用到.name属性,所以每一个需要全局注册的组件,都需要有name属性!
    2.本示例中的app是vue3.0的写法,2.0请用vue(其实是一样的)

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    trap命令
    MySQL数据库中日期中包涵零值的问题
    MySQL锁等待分析【2】
    MySQL锁等待分析【1】
    mysql日志文件相关的配置【2】
    mysql日志文件相关的配置【1】
    Linux的标准输出、标准错误输出、nohup
    mysql在关闭时的几个阶段
    MHA环境搭建【4】manager相关依赖的解决
    keepalived+httpd 做web服务的高可用
  • 原文地址:https://www.cnblogs.com/XF-eng/p/15200675.html
Copyright © 2020-2023  润新知