vue3 循环遍历引入文件夹下的多个组件

14 篇文章 0 订阅
4 篇文章 0 订阅

假如有这样一个文件夹,下面的组件都需要引入到页面上,并控制他的显示隐藏
在这里插入图片描述

我们不想在页面上这样去重复去引入、罗列
在这里插入图片描述

那就想想办法吧~

一、新建queryFunc.js文件(把某个(components)文件夹下的文件都引入)
有两种写法,大家自行选择

第一种方法
const utilFuns = {};
 const files = import.meta.globEager('./components/*.vue');
 Object.keys(files).forEach((fileName) => {
  const name = fileName.replace(/\.\/|\.ts/g, '');
 utilFuns[name] = files[fileName].default;
 });
 export default utilFuns;

第二种方法
const modulesFiles = import.meta.globEager('./components/*.vue');
// you do not need `import app from './modules/app'`
// it will auto require all vuex module from modules file
const modules = Object.keys(modulesFiles).reduce((modules, modulePath) => {
  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1');
  const value = modulesFiles[modulePath];
  modules[moduleName] = value.default;
  return modules;
}, {});

export default modules;

需要注意的是如果构建工具用的vite,使用import.meta.globEager,不然会报错

import.meta.globEager('./components/*.vue')

如果构建工具用的webpack, import.meta.globEager可替换为

require.context('./components', true, /\.vue$/);

二、父组件中
我这里用的是vue3 setup写法,没法注册组件,所以转换了一下变成数组

<script lang="ts" setup>
  import queryFunc from './queryFunc';
  let components = Object.values({ ...queryFunc });
</script>

如果是vue2注册组件的话可写成这样吧

components: {...queryFunc }

三、template中使用组件

	//item.__name为组件名称
     <div v-for="item in components" :key="item.__name">
          <template v-if="item.__name == 'form' + active.toString()">
            <component :is="item" :formInfo="formInfo" />
          </template>
     </div>

本来可以直接循环component的,但是编辑器提示说v-if不能用于component组件上,就加了一层template,然后呢,又说key不能写到template上,就又加了一层div,这就是最终写法啦

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值