vue.js - 将数据从子组件传递到组件的正确方法?

vue.js - right way to pass data from child to component?

我对将数据从根实例传递到组件的正确方法有点困惑。

假设我有这个根实例:

const app = new Vue({
    el: '#app',

    data: {
        foo: 'bar'
    },
});

然后我在一个单独的 .vue 文件中有一个组件:

<template>
    <div>I'm a component!</div>
</template>

<script>
    export default {
        methods: {
            fooTest: function() {   
                console.log(this.$root.$data.foo);
            },
        },

        mounted() {
           this.fooTest();
        }
    }
</script>

这很好用。 fooTest 将从根实例数据中获取 "bar"。

但这是正确的方法吗?或者最佳做法是什么?

你不应该使用 this.$root.$data。它现在可能有效,但是当您的应用程序增长时,您的调试工作量将大大增加。当您与一组开发人员一起开发同一个应用程序时,这将是一场噩梦。

相反,您应该使用适当的 parent-child 通信。这是官方文档:

从 parent 到 child: https://vuejs.org/guide/components.html#Passing-Data-with-Props

从child到parent:https://vuejs.org/guide/components.html#Using-v-on-with-Custom-Events

这是 Whosebug 中的另一个参考资料,可以帮助您解决问题:

该参考答案中的 jsFiddle 示例有一个 parent 组件将数据传递给 child 和 child 组件将事件传递给 parent 的情况。

简而言之,parent可以向child传递数据并监听child事件,如下:

<child-component :data-from-parent="someValue" v-on:event-from-child="methodInParent"></child-component>

和child组件可以从parent接收上述数据如下:

Vue.component('child-component', {
    props: ["dataFromParent"],
    ...
});

您可以按照那个 jsFiddle 示例来更好地理解这种通信的工作原理。