如何在Vue.js中动态安装单个文件组件

Mic*_*_S_ 5 javascript vue.js

我有一个文件组件Main.Vue.

我还有三个其他单个文件组件A.vue,B.vueC.vue.

我希望每次都能在Main.Vue内部显示一个不同的组件.我做的是这样的:

<template>
<div>
<a v-if="isAVisible" ></a>
<b v-if="isBVisible" ></a>
</div>
</template>

<script>
import A from './A.vue';
import B from './B.vue';
...
Run Code Online (Sandbox Code Playgroud)

这可行但不完全是我想要的.我想要一个不同的文件Factory.js,它可以导入所有组件A,B,C,..并且具有返回我的组件的函数,我可以在Main.vue中以某种方式使用.这是我试过Factory.js的样子:

import A from './A.vue';
import B from './B.vue';
function getComponent(){
  if (..)
    return new A();
  else if (..)
    return new B();
  ...
}
Run Code Online (Sandbox Code Playgroud)

这根本不起作用.我想要工厂文件方法,因为:

1)我想将它拆分为不同的工厂文件

2)我想"附加"数据到每个组件.所以我将有一个对象,其中包含返回实际组件的函数+一些额外的数据,如"name"

任何想法如何做到这一点?

Win*_*ing 9

使用Vue的动态组件

您可以使用动态组件在组件之间动态切换.您需要将组件定义对象绑定到元素的is属性component- Vue的文档是非常自我解释的.以下是一个简短的例子:

<template>
  <component :is="activeComponent"></component>
</template>
Run Code Online (Sandbox Code Playgroud)
import componentA from 'component/a';
import componentB from 'component/b';

export default {
  components: {
    componentA,
    componentB,
  },

  data() {
    return {
      activeComponent: 'componentA',
    },
  },
};
Run Code Online (Sandbox Code Playgroud)

您可以直接将组件定义对象绑定到data属性本身:

import componentA from 'component/a';
import componentB from 'component/b';

export default {
  data() {
    return {
      activeComponent: componentA,
    };
  },
};
Run Code Online (Sandbox Code Playgroud)

要切换组件,您可以以编程方式更改值activeComponent.

使用渲染功能

使用组件渲染功能可以实现动态安装组件的更强大的方法.要做到这一点,我们必须创建我们自己的Vue component元素版本 - 我们称之为ElementProxy:

import componentA from 'component/a';
import componentB from 'component/b';

export default {
  components: {
    componentA,
    componentB,
  },

  props: {
    type: {
      type: String,
      required: true,
    },
    props: {
      type: Object,
      default: () => ({}),
    },
  },

  render(createElement) {
    const { props: attrs } = this;
    return createElement(element, { attrs });
  },
};
Run Code Online (Sandbox Code Playgroud)

您现在可以使用ElementProxy代理元素.这样做的另一个好处是,您可以将props作为对象传递,这将解决将props传递给具有不同模型的动态组件的问题.

<template>
  <element-proxy :type="activeComponent" :props="props"></element-proxy>
</template>
Run Code Online (Sandbox Code Playgroud)
import ElementProxy from 'components/elementProxy';

export default {
  components: {
    ElementProxy,
  },

  data() {
    return {
      activeComponent: 'componentA',
      props: { ... },
    };
  },
};
Run Code Online (Sandbox Code Playgroud)

进一步阅读