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

Qar*_*Qar 1 vue.js vue-component

关于将数据从根实例传递到组件的正确方法,我有点困惑.

假设我有这个根实例:

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

    data: {
        foo: 'bar'
    },
});
Run Code Online (Sandbox Code Playgroud)

然后我在一个单独的.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>
Run Code Online (Sandbox Code Playgroud)

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

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

Man*_*ani 8

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

相反,你应该使用适当的亲子沟通.以下是官方文档:

从父母到孩子:https://vuejs.org/guide/components.html#Passing$-with-Props

从孩子到父母:https://vuejs.org/guide/components.html#Using-v-on-with-Custom-Events

以下是StackOverflow中的另一个参考资料,可以帮助您:https://stackoverflow.com/a/40181591/654825

该参考答案中的jsFiddle示例具有父组件将数据传递给子的情况,以及子组件将事件传递给父组件.

简而言之,父级可以将数据传递给子级并监听子级事件,如下所示:

<child-component :data-from-parent="someValue" v-on:event-from-child="methodInParent"></child-component>
Run Code Online (Sandbox Code Playgroud)

并且子组件可以从父级接收上述数据,如下所示:

Vue.component('child-component', {
    props: ["dataFromParent"],
    ...
});
Run Code Online (Sandbox Code Playgroud)

您可以按照该jsFiddle示例来更好地理解此通信的工作原理.