6

为了使用动态定义的单页组件,我们使用component标签,因此:

<component v-bind:is="componentName" :prop="someProperty"/>

...

import DynamicComponent from '@/components/DynamicComponent.vue';

...
components: {
    DynamicComponent
},

props: {
    componentName: String,
    someProperty: null,
}

问题是,这根本不是非常动态的,因为我们可能想在这里使用的每个组件不仅需要静态导入,而且还需要注册到components.

我们尝试这样做,至少是为了避免需要导入所有内容:

created() {
    import(`@/components/${this.componentName}.vue`);
},

但当然这失败了,因为它似乎DynamicComponent必须在到达之前定义created()

我们如何才能使用真正动态的组件,即在运行时导入和注册,只给出它的名称?

4

4 回答 4

4

来自文档强调我的

<!-- Component changes when currentTabComponent changes -->
<component v-bind:is="currentTabComponent"></component> 

在上面的示例中,currentTabComponent可以包含:

  • 注册组件的名称,
  • 组件的选项对象

如果currentTabComponent是组件的数据属性,您可以简单地导入组件定义并将其直接传递给组件标记,而无需在当前模板上定义它。

这是一个示例,如果单击 Vue 徽标,组件内容将发生变化。

像这样:

<component :is="dynamic" />

...

setComponentName() {
    this.dynamic = () => import(`@/components/${this.componentName}.vue`);
},
于 2019-09-24T10:14:45.033 回答
3

仅适用于 Nuxt 的解决方案

到目前为止,可以在 Nuxt ( nuxt/components) 中自动导入组件。如果你这样做了,当你在你的 vue 模板中使用它们时,你就有一堆组件可以注册,例如:

<MyComponent some-property="some-value" />

如果你想拥有真正动态的组件,nuxt/components你可以利用 Nuxt 自动准备组件的方式。我创建了一个包,它为自动导入的组件启用动态组件(您可以在这里查看:)@blokwise/dynamic

长话短说:使用该包,您可以像这样动态导入组件:

<NuxtDynamic :name="componentName" some-property="some-value" />

componentName可能在哪里'MyComponent'。该名称可以静态存储在变量中,甚至可以通过对后端/CMS 的某些 API 调用动态创建。

如果您对底层魔法的工作原理感兴趣,可以查看这篇文章:为动态 Nuxt.js 组件启动自动导入

于 2020-12-30T23:34:51.220 回答
0

根据官方文档:从 v2.13 开始,Nuxt 可以在您的模板中使用时自动导入您的组件,要激活此功能,请在您的配置中设置 components: true

于 2020-12-02T17:37:25.990 回答
0

你在谈论异步组件。您只需使用以下语法即可返回带有承诺的组件定义。

Vue.component('componentName', function (resolve, reject) {
  requestTemplate().then(function (response) {
    // Pass the component definition to the resolve callback
    resolve({
      template: response
    })
  });
})
于 2019-09-24T08:51:32.347 回答