以编程方式从文件夹中导入 Vue 组件,而不是硬编码(我实际上使用的是 Nuxt,但我将其称为 Vue)

Posted

技术标签:

【中文标题】以编程方式从文件夹中导入 Vue 组件,而不是硬编码(我实际上使用的是 Nuxt,但我将其称为 Vue)【英文标题】:Import Vue components from folder programmatically not hard coded (I'm actually using Nuxt but I'll call it Vue) 【发布时间】:2021-11-15 13:12:02 【问题描述】:

我在 Vue 中有许多 SVG 卡作为组件;我可能有50个或更多。我可以在脚本标签之后一一导入:

<script>
import MyVueComponent1 from "~/components/MyVueComponent1.vue";
import MyVueComponent2 from "~/components/MyVueComponent2.vue";
import MyVueComponent3 from "~/components/MyVueComponent3.vue";
...
import MyVueComponent50 from "~/components/MyVueComponent50.vue";

但我一直在阅读,我可以通过编程方式完成此操作。我只是还没有找到任何一个让我一目了然的例子。我能够动态注册组件,但我不确定如何导入整个组件文件夹。

我能够在创建的钩子中使用此代码动态注册组件:

created() 
    const requireComponent = require.context(
      // Look for files in the current directory
      "../components",
      // Do not look in subdirectories
      false,
      // Only include "S" prefixed .vue files
      /S[\w-]+\.vue$/
    );

    // For each matching file name...
    requireComponent.keys().forEach((fileName) => 
      // Get the component config
      const componentConfig = requireComponent(fileName);
      // Get the PascalCase version of the component name
      fileName = fileName.replace("./", "");
      fileName = fileName.replace(".vue", "");
      const componentName = fileName;
      this.generatedComponentList.push(componentName);
      // Globally register the component
      Vue.component(componentName, componentConfig.default || componentConfig);
    );
  ,

我正在使用组件名称的 generatedComponentList 来显示卡片:

<div
      v-for="componentName in generatedComponentList"
      :key="componentName"
    >
      <component :is="componentName" :id="componentName"></component>
    </div>

但我很想摆脱脚本标签下的所有导入行,并拥有更简洁、更动态的代码。这样,如果我在文件夹中添加一个新的组件卡,它只会被“拾取”并显示,而无需添加“导入”行或注册组件等。希望我已经清楚地表达了我在寻找什么去实现。

【问题讨论】:

我不明白你的问题 - 特别是最后一段。 require.context 完全符合您的要求 - 只需删除您的静态导入 这能回答你的问题吗? How do I properly import multiple components dynamically and use them in Nuxt? @kissu 我不认为他在寻找动态组件。在我看来,这一切在运行时都是静态的,但在构建时是动态的——更像是在构建时自动发现组件 + 创建要在运行时使用的组件列表 【参考方案1】:

Nuxt 会自动从 ~/components 目录导入您使用的组件,因此您无需显式导入或注册它们。

此功能在nuxt.config.js 中通过components config 启用:

// nuxt.config.js
export default 
  components: true

【讨论】:

如果你想导入那么所有即使嵌套到components中的其他其他目录,你可以按照这个答案:***.com/a/66336654/8816585 同时,我不确定它在性能方面是不是最好的:github.com/nuxt/components/issues/227#issuecomment-902013353【参考方案2】:

感谢 tony19 建议我查看 nuxt.config.js 文件,您的回答肯定让我走上了正轨;还要感谢建议1 的人可能是正确的答案。

这是对我有用的解决方案:

根据 tony19 的建议,我查看了我的 nuxt.config.js 文件;特别是组件部分。我的代码中已经有这一行来自动导入组件文件夹中的任何组件:

components: true,

但我要导入的组件嵌套在 components 文件夹中的另一个文件夹中。

在阅读了来自 nuxt.org 文档的 2 之后,我将之前的代码替换为:

//components: true,
  components: [
    // Equivalent to  path: '~/components' 
    '~/components',
     path: '~/components/myTargetComponents', extensions: ['vue'] 
  ],

然后,我能够删除所有导入行:

<script>
import MyVueComponent1 from "~/components/MyVueComponent1.vue";
import MyVueComponent2 from "~/components/MyVueComponent2.vue";
import MyVueComponent3 from "~/components/MyVueComponent3.vue";
...
import MyVueComponent50 from "~/components/MyVueComponent50.vue"; 

在我的 index.vue 文件中,组件部分中不再列出任何内容......这只是对我自己的提醒:

,
  components: 
    //see nuxt.config.js file ...component section
  ,

为了清楚起见,在我的 index.vue 文件中,我没有使用这种格式导入任何组件,“import MyVueComponent1 from "~/components/MyVueComponent1.vue"; 而且我没有在组件部分。另外只是为了澄清一下,我要导入的组件位于组件文件夹的子文件夹中(~/components/myTargetComponents)。我现在意识到我在原始帖子中没有清楚地表达这一点。

作为一个相关的部分......

从我的原始帖子中可以看出,我在 created 钩子中使用了一段代码来填充组件名称列表:

this.generatedComponentList.push(componentName);

然后使用此列表遍历组件卡:

<div
      v-for="componentName in generatedComponentList"
      :key="componentName"
    >
      <component :is="componentName" :id="componentName"></component>
    </div>

但我想知道是否存在由 nuxt.config.js 文件生成的这些组件的列表。有什么建议?再次感谢大家的帮助,非常感谢。

【讨论】:

以上是关于以编程方式从文件夹中导入 Vue 组件,而不是硬编码(我实际上使用的是 Nuxt,但我将其称为 Vue)的主要内容,如果未能解决你的问题,请参考以下文章

从 vue 组件的公共文件夹中导入 js 文件(Laravel)

什么是从同一个文件中导入多个组件的正确方法,而不是导入每个组件

注册全局组件和局部组件

无法从 npm 包中导入 vue 组件

在 vue 组件的 laravel 中导入 json 文件

在 VueJS 中导入带有字体的 CSS 文件