【问题标题】:Vuejs passing data between parent child components using slotsVuejs使用插槽在父子组件之间传递数据
【发布时间】:2018-03-14 13:04:38
【问题描述】:

我可以像这样创建父子组件:

子组件

Vue.component('my-child', {
    template: '<div>{{value}}</div>',
    props: {
        value: {
            type: String,
            default: ""
        }
    }
});

父组件

注意在父模板中是如何引用 my-child 组件的。

Vue.component('my-parent', {
    template: '<div><span>Hello</span><my-child :value="value"></my-child></div>',
    data: function () {
        return {
            value: ""
        }
    },    
});

然后我可以像这样使用它:

<my-parent :value="ABC"></my-parent>

值“ABC”被正确传递给孩子并按预期显示。

但是,我需要做的是如下(基本上我已经将 my-child 拉出父模板并返回到 HTML。我将拥有许多不同的 my-child 组件,我可以在我的父母内部使用):

<my-parent :value="ABC">
    <my-child></my-child>
</my-parent>

我将父组件更改为使用这样的插槽:

Vue.component('my-parent', {
    template: '<div><span>Hello</span><slot :value="value"></slot></div>',
    data: function () {
        return {
            value: ""
        }
    },    
});

my-child 模板正在被拾取并显示,但 ABC 值没有像我预期的那样传递到 my-child 组件。

如果我这样做:

<my-parent :value="ABC">
    <my-child :value="value"></my-child>
</my-parent>

my-child 绑定实际上是在根实例而不是从 my-parent 中查找“值”,这不是我想要的。

如何通过插槽向下传递数据?

【问题讨论】:

    标签: vue.js vuejs2


    【解决方案1】:

    要将数据从组件传递到其插槽中的内容,您需要使用scoped slot

    在父组件模板中,将要传递给子组件的属性添加到槽中:

    <div><span>Hello</span><slot :value="value"></slot></div>
    

    然后在使用父级的模板中,使用带有scope 属性的template 标记。

    <my-parent :value="ABC">
      <template scope="props">
        <my-child :value="props.value"></my-child>
      </template>
    </my-parent>
    

    这是一个有效的fiddle

    【讨论】:

    • 这就是我阅读文档的方式,但它不起作用。我确实意识到我仍然只使用 vue 2.0,这是 2.1 的功能,所以我升级到最新版本但仍然无法正常工作。它不是在抱怨不存在的属性或任何东西。这一切似乎编译和运行没有错误。它只是没有在子组件中设置值。
    • @Jeff-SoftwareResults 您必须提供更多信息。这绝对是作用域插槽的工作方式。
    • 在这里创建了一个小提琴jsfiddle.net/softwareresults/fgq2utqa/1 我想要的是当我在顶层 vue 更改值时,它应该通过这两个组件。但目前我什至没有任何运气让它下降到父级:-(在使用数据和属性之间感到非常困惑。
    • 这里的新小提琴:jsfiddle.net/softwareresults/dh75xLdy 这个使用道具而不是数据(做了一些阅读:-))。根据我上面的问题,该值确实会传递给父级,但不会传递给子级。
    • 谢谢!!我尝试了各种类似的组合,但一定不能找到那个:-(如果你想更新你的答案,我会把它标记为正确的。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2017-12-06
    • 2018-02-21
    • 1970-01-01
    • 2020-10-26
    • 2017-09-29
    • 2018-08-19
    • 2017-09-04
    • 2017-12-24
    相关资源
    最近更新 更多