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

我还有另外三个单文件组件A.vueB.vueC.vue.

我想展示一下主楼的内部.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';
...

这很管用,但不是我想要的.我想要一个不同的文件Factory.js,它负责导入所有组件ABC,..有返回我的组件的函数,我可以在Main.vue中使用.这是我在工厂里试过的.js看起来像:

import A from './A.vue';
import B from './B.vue';
function getComponent(){
  if (..)
    return new A();
  else if (..)
    return new B();
  ...
}

这根本没用.

1) 我想把它拆分成不同的工厂文件

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

有什么办法吗?

推荐答案

Use Vue's Dynamic Components

可以使用Dynamic Components在组件之间动态切换.您需要将component definition对象绑定到component元素的is属性——Vue关于这一点的文档非常不言自明.下面是一个简单的例子:

<template>
  <component :is="activeComponent"></component>
</template>
import componentA from 'component/a';
import componentB from 'component/b';

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

  data() {
    return {
      activeComponent: 'componentA',
    },
  },
};

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

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

export default {
  data() {
    return {
      activeComponent: componentA,
    };
  },
};

要切换出组件,可以通过编程方式更改activeComponent的值.

Use a render function

使用组件render functions可以实现更强大的动态安装组件的方法.要做到这一点,我们必须创建Vue component元素中的our own version个元素——我们将其称为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 });
  },
};

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

<template>
  <element-proxy :type="activeComponent" :props="props"></element-proxy>
</template>
import ElementProxy from 'components/elementProxy';

export default {
  components: {
    ElementProxy,
  },

  data() {
    return {
      activeComponent: 'componentA',
      props: { ... },
    };
  },
};

Further reading

Vue.js相关问答推荐

在Nuxt项目中混合Scrolltrigger与Lenis

如何将$validator实例注入到使用组合API语法的Vue2.7应用程序中

Vutify-v-工具提示-不使用键盘轻击按钮显示

在哪里可以找到在线沙箱 Vuetify 3 模板来创建最小的可重现示例?

vuejs中如何获取数组总长度

在 Vue.js 2.6 的 Javascript 中访问 的内容

如何在 v-for 指令切换状态下安全地制作包含附加到对象的复选框的列表(W/O 切换列表中的其他复选框)?

Vue子组件等待props

Vue + Webpack 构建显示空白页面

在 Vue.js 中动态挂载单个文件组件

如何在 Vue.js 中获取完整的当前日期和时间,而无需编写大量 JavaScript 行

Webpack 你可能需要一个合适的加载器来处理这个文件类型

在 vue 组件中检索配置和环境变量

查看 cli3 启用 CORS

使用 Vue.js (cdn) 在特定元素上切换显示/隐藏

如何在 vuetify 中将工具提示添加到数据表标题?

如何使用 Vue Test utils 测试输入是否聚焦?

根据nuxt中的url参数动态加载组件

Vue v-model 不响应 BS4 单选按钮组

如何将单选按钮绑定到 vuex store ?