【问题标题】:Dynamically import components动态导入组件
【发布时间】:2019-09-15 18:49:23
【问题描述】:

我有一个名为 Home.vue 的组件,我尝试动态导入组件。

我的vue组件是

<template>
    <div>
        <!-- NEW -->
        <div v-for="widget in widgets">
            <component v-bind:is="componentFile"></component>
        </div>
        <!-- NEW -->

        <!-- OLD - to be deleted -->
        <widget-name1></widget-name1>
        <widget-name2></widget-name2>
        <!-- OLD -->

    </div>


</template>

<script>

    // import Name1 from '../components/widgets/Name1.vue';
    // import Name2 from '../components/widgets/Name2.vue';

    export default {
        data() {
            return {
                widget: 'Name1',
                widgets: [
                    'Name1',
                    'Name2',
                ],
            }
        },

        components: {
            // WidgetName1: Name1,
            // WidgetName2: Name2,
        },

        computed: {
            componentFile() {
                return (widget) => import(`./widgets/${this.widget}.vue`);
            }
        }

    }
</script>

我想拥有多个小部件并使用名为小部件的变量对它们进行排序。 此代码现在呈现两次名为 Name1 的小部件。 我如何将变量传递给 componentFile,例如(小部件)以动态渲染组件,因为 this.widget 参考 widget: 'Name1'.

如果我这样做:

<div v-for="widget in widgets">
     <component v-bind:is="componentFile(widget)"></component>
</div>

我遇到了一个错误 Failed to mount component: template or render function not defined.

【问题讨论】:

  • 这个错误的原因是导入返回了一个promise。

标签: vue.js


【解决方案1】:

好吧,你需要以任何方式在components注册组件。

要做的事情是:

<template>
  <div>
    <div v-for="widget in widgets">
      <component v-bind:is="widget"></component>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      widgets: [
        'Name1',
        'Name2',
      ],
    }
  },
  components: {
    Name1: () => import(`./widgets/Name1.vue`),
    Name2: () => import(`./widgets/Name2.vue`),
  },
}
</script>

通过注册这样的组件,您可以确保只导入使用过的组件。

【讨论】:

  • 非常感谢您的回答!但是有没有办法让组件:{} 更加动态?如果我有 10 个小部件,我需要写很多行。所以我只想拥有小部件数组并动态加载所有小部件。例如components: importWidgets(this.widgets), 和这个方法来导入我的文件。
  • 你可以使用链接中的 reduce 函数 ;-) function loadWidgets(widgets){ return widgets.reduce((current, widget) => ({ ...current, [widget]: () => System.import(/widgets/${widget}.vue) }), {}) } 导出默认{组件:loadWidgets(['WidgetOne', 'WidgetTwo', 'WidgetThree']) }
  • 是的,它只适用于组件:loadWidgets(['Name1', 'Name2']); 而不是loadWidgets(this.widgets);,所以我完全不明白,我两天前学习了 vue,所以它与 jQuery 真的不同。对不起:(
  • 我的意思是,我需要进行 ajax 调用,存储小部件名称并渲染它们,所以我不知道名称会是什么。我必须只使用 widgets 变量来呈现我的页面。
猜你喜欢
  • 2020-06-18
  • 2019-02-03
  • 2018-11-21
  • 2018-06-24
  • 1970-01-01
  • 2019-04-23
  • 2017-05-31
  • 2020-01-24
  • 1970-01-01
相关资源
最近更新 更多