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,这就是最终写法啦

Vue 3 中,可以通过以下步骤引入 `components` 文件夹下的所有 `index.vue` 文件: 1. 首先确保 `components` 文件夹下所有的 `index.vue` 文件都已经正确命名和导出。 2. 在 `App.vue` 或者其他需要使用这些组件的页面中,可以使用 `require.context` 方法来自动导入这些组件。 ```typescript // 引入 require.context 方法 const requireComponent = require.context( // 组件文件夹的相对路径 './components', // 是否查询子文件夹 true, // 匹配基础组件文件名的正则表达式 /\/index\.vue$/ ) export default { components: { // 遍历所有自动导入的组件 ...requireComponent.keys().reduce((components, componentPath) => { // 获取组件名 const componentName = componentPath .split('/') .pop() .replace(/\.\w+$/, '') // 导入组件 const component = requireComponent(componentPath).default // 添加到 components 对象中 components[componentName] = component return components }, {}) } } ``` 上面的代码中,`require.context` 方法接收三个参数: - 第一个参数是组件文件夹的相对路径。 - 第二个参数是一个布尔值,表示是否查询子文件夹。 - 第三个参数是一个正则表达式,用于匹配组件文件名。 `requireComponent.keys()` 方法返回一个数组,包含匹配到的所有组件文件路径。 然后通过 `reduce` 方法遍历这个数组,将每个组件自动导入并添加到 `components` 对象中。 最后,将 `components` 对象添加到 Vue 实例的 `components` 选项中即可使用。 例如: ```html <template> <div> <HelloWorld /> <MyComponent /> </div> </template> <script> import HelloWorld from './components/HelloWorld/index.vue' import MyComponent from './components/MyComponent/index.vue' export default { components: { HelloWorld, MyComponent } } </script> ``` 这样就可以在 Vue 3 中自动导入 `components` 文件夹下的所有 `index.vue` 组件了。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值