【问题标题】:Pass a vue component to a child component将 vue 组件传递给子组件
【发布时间】:2017-12-02 05:00:54
【问题描述】:

我正在尝试创建一个 Vue 组件,该组件将接受一个组件作为参数来显示数据,但我无法弄清楚如何使其工作。如果我全局注册显示组件(使用 Vue.component()),它可以工作,但如果我在本地注册它,我会收到以下错误:

[Vue warn]: Unknown custom element: <my-link> - did you register the component correctly? For recursive components, make sure to provide the "name" option.

谁能告诉我如何通过本地注册来完成这项工作?

主要组件:

<template>
    <div>
        <my-list :items="items" :renderer="renderer"></my-list>
    </div>
</template>
<script>
import MyList from './my-list'
export default {
    components: {
        'my-list': MyList,
        'my-link': {
            props: { data: Object },
            template: '<span>{{ data.Name }}</span>'
        }
    },
    data() {
        return {
            items: [
                { id: 1, Name: 'One' },
                { id: 2, Name: 'Two' }
            ],
            renderer: 'my-link'
        }
    }
}
</script>

我的列表组件:

<template>
    <div>
        <div v-for="item in items" :key="item.id">
            <div :is="renderer" :data="item"></div>
        </div>
    </div>
</template>
<script>
export default {
    props: { 
        items: Array,
        renderer: String
    }
}
</script>

【问题讨论】:

  • 如果您希望能够在该范围内使用my-link 组件,则需要将import MyLink from './my-link' 添加到MyList 组件的脚本顶部
  • @thanksd 没有“./my-link”。另外,我希望能够使用任何组件:MyList 不需要知道它可以使用哪些组件。
  • 啊,我误读了 my-list vs my-link
  • 为什么不使用插槽?
  • @laurian 你可能想看看这个example 的来源。插槽正是他用于自定义单元格的地方。

标签: vue.js


【解决方案1】:

您看到此警告是因为您尚未在尝试使用它的组件范围内注册 my-link。您在 Main 组件中注册了 my-link,但 MyList 组件无权访问到那个范围。

my-link 的组件定义移动到 MyList 组件的 components 属性将解决此问题。


或者,您可以为my-link 组件创建一个新的单文件组件,并将其导入到您想要使用的任何位置。就像您对 my-list 组件所做的那样。


如果您希望 my-link 组件可全局访问,则需要通过 Vue.component 注册它,无论您在哪里实例化根 Vue 实例(如果您使用 vue-cli 进行设置,则可能在 src/main.js你的项目):

Vue.component('my-link', {
  props: { data: Object },
  template: '<span>{{ data.Name }}</span>'
});

new Vue({
  el: '#app',
  ...
});

如果您真的想要将组件传递给子组件,而不注册到该子组件,您可以按照@BertEvans 的建议pass the component definition as a property

【讨论】:

  • 我忘记添加“我的列表”组件...抱歉。我更新了我的问题。
  • 就没有别的办法了吗?我可以将组件作为对象传递,例如 renderer: { template: .... } 但是如何在 MyList 上使用它?
  • 查看我的更新答案。这就是你可以做到的三种方式。我不相信还有其他方法。
  • 大概您可以将对象定义作为属性传递。
  • @BertEvans 你能详细说明一下吗?
猜你喜欢
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 2020-04-23
  • 2018-11-16
  • 1970-01-01
  • 2021-01-18
  • 2019-11-12
相关资源
最近更新 更多