如何将数据从 Vue 实例传递到 Vue.component?

Posted

技术标签:

【中文标题】如何将数据从 Vue 实例传递到 Vue.component?【英文标题】:How to passing data from Vue instance into a Vue.component? 【发布时间】:2017-12-04 15:58:51 【问题描述】:

我有一个包含两个组件的 Vue 实例。如果用户单击第二个组件中的按钮,我想隐藏第一个组件的模板。

我有这个代码:

<div id="app">
    <mycomp-one :active="active"></mycomp-one>
    <mycomp-two></mycomp-two>
</div>

<template id="mycomponent-one">
    <div v-show="!active">
        <!-- ... --->
    </div>
</template>

<template id="mycomponent-two">
    <button v-on:click="setActive">Click Me</button>
</template>

使用此脚本代码:

Vue.component('mycomp-one', 
    template: '#mycompnent-one',
    // etc...
);
Vue.component('mycomp-two', 
    template: '#mycomponent-two',
    data: function() 
        return 
            active: false
        ;
    ,
    methods: 
        setActive: function() 
            this.$parent.$options.methods.setActive();
        ,
    ,
);
new Vue(
    el:'#app',
    data:
        active: false
    ,
    methods: 
        setActive: function() 
            this.active = !this.active;
        ,
    ,
);

如果单击按钮,则可以将信息从组件传递到实例。但是这里正在停止数据流,mycomp-one 组件没有得到更改。我该如何解决?如果活动为真,我想隐藏mycomp-one

【问题讨论】:

【参考方案1】:

this.$parent.$options.methods.setActive() 不是绑定到 Vue 的方法。我不确定您是如何到达这里的,但这不是您在父级上调用方法的方式。

console.clear()
Vue.component('mycomp-one', 
    props:["active"],
    template: '#mycomponent-one',
);
Vue.component('mycomp-two', 
    template: '#mycomponent-two',
    data: function() 
        return 
            active: false
        ;
    ,
    methods: 
        setActive: function() 
            this.$parent.setActive();
        ,
    ,
);
new Vue(
    el:'#app',
    data:
        active: false
    ,
    methods: 
        setActive: function() 
            this.active = !this.active;
        ,
    ,
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js"></script>
<div id="app">
    <mycomp-one :active="active"></mycomp-one>
    <mycomp-two></mycomp-two>
</div>

<template id="mycomponent-one">
    <div v-show="!active">
       Stuff
    </div>
</template>

<template id="mycomponent-two">
    <button v-on:click="setActive">Click Me</button>
</template>

除此之外,组件不应调用其父级的方法。他们应该发出父母收听的事件。 documentation 对此进行了很好的介绍。

console.clear()
Vue.component('mycomp-one', 
    props:["active"],
    template: '#mycomponent-one',
);
Vue.component('mycomp-two', 
    template: '#mycomponent-two',
    data: function() 
        return 
            active: false
        ;
    ,
    methods: 
        setActive: function() 
            this.active = !this.active
            this.$emit("set-active", this.active)
        ,
    ,
);
new Vue(
    el:'#app',
    data:
        active: false
    ,
    methods: 
        setActive: function() 
            this.active = !this.active;
        ,
    ,
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js"></script>
<div id="app">
    <mycomp-one :active="active"></mycomp-one>
    <mycomp-two @set-active="active = $event"></mycomp-two>
</div>

<template id="mycomponent-one">
    <div v-show="!active">
       Stuff
    </div>
</template>

<template id="mycomponent-two">
    <button v-on:click="setActive">Click Me</button>
</template>

【讨论】:

以上是关于如何将数据从 Vue 实例传递到 Vue.component?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从 Vue 实例传递给嵌套组件

如何将数据从 Vue 实例传递给嵌套组件

Vue.js 将数据从插槽传递到组件实例

将刀片文件中的数据直接传递给 Vue 实例

如何将数据从 laravel 传递到 Vue Router?

Vue:如何将数据从父组件传递到所需的子组件?