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

How to passing data from Vue instance into a Vue.component?

我有一个包含两个组件的 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

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>