• Vue中父组件与子组件之间传值


    方法一(推荐)

    父组件传值给子组件:在父组件中通过自定义属性的方式,将数据传递给子组件,然后在子组件中使用“props”选项接收来自父组件的数据。

    子组件传值给父组件:在子组件中使用“vm.$emit”触发事件并携带附加参数,而在父组件中监听指定事件,执行的回调函数中可以获取所有附加参数。另外普通的元素上使用“v-on”指令只能监听原生 DOM 事件,但是在自定义组件上也可以用来监听子组件触发的事件。

    示例:

    父组件传值给子组件:

        //    在父组件中自定义属性
        Vue.component('parent',{
            template: '<div class="parent"><children someProps="hello"></children></div>'
        });
        //    在子组件中接收
        Vue.component('children',{
            template: '<div class="children"></div>',
            props: ['someProps'],
            mounted: function() {
                console.log(this.someProps);    // 输出hello
            }
        });

    子组件传值给父组件:

        // 在父组件中监听事件
        Vue.component('parent',{
            template: '<div class="parent"><children @someEvents="doSomething"></children></div>',
            methods: {
                doSomething: function(params) {
                    console.log(params);    // 输出hello
                }
            } 
        });
        // 在子组件中触发事件
        Vue.component('children',{
            template: '<div class="children"></div>',
            mounted: function() {
                this.$emit('someEvents','hello');
            }
        });

    方法二

    父组件传值给子组件:在子组件中可以通过“vm.$parent”访问父组件实例,从而获取到父组件的数据或调用父组件的方法。

    子组件传值给父组件:通过给子组件添加“ref”属性注册引用信息,然后在父组件中使用"vm.$refs"访问指定引用信息的子组件实例。

    示例:

    父组件传值给子组件:

        Vue.component('parent',{
            template: '<div class="parent"><children></children></div>',
            data: function() {
                return {
                    message: 'hello'
                };
            }
        });
        // 在子组件中访问父组件实例
        Vue.component('children',{
            template: '<div class="children"></div>',
            mounted: function() {
                console.log(this.$parent.message);    // hello
            }
        });

    子组件传值给父组件:

        // 在父组件中访问子组件实例
        Vue.component('parent',{
            template: '<div class="parent"><children ref="childrenOne"></children></div>',
            mounted: function() {
                console.log(this.$refs.childrenOne.message);    // hello
            }
        });
        Vue.component('children',{
            template: '<div class="children"></div>',
            data: function() {
                return {
                    message: 'hello'
                };
            }
        });

    方法三

    在所有组件中都可以使用"vm.$root"来访问根实例,因此在小型或只有少量组件的应用中,可以作为全局 store 用来管理数据状态。这种方法不但可以用作父子之间传参,也可以用作兄弟组件之间传参。

    示例一:

        Vue.component('parent',{
            template: '<div class="parent"><children></children></div>',
            created: function() {
                this.$root.message = 'hello';
            }
        });
        Vue.component('children',{
            template: '<div class="children"></div>',
            created: function() {
                console.log(this.$root.message);    // hello
            }
        });

    示例二:

        Vue.component('parent',{
            template: '<div class="parent"><children></children></div>',
            created: function() {
                this.$root.$on('someEvents',function(params) {
                    console.log(params);    // hello
                });
            }
        });
        Vue.component('children',{
            template: '<div class="children"></div>',
            created: function() {
                this.$root.$emit('someEvents','hello');
            }
        });

    方法四

    对于复杂的大中型单页应用,多个组件共享状态时,传统的单向数据流传参的模式会变得非常繁琐,导致代码无法维护,此时可以使用 Vuex 将组件的共享状态抽离出来作为一个全局单例模式管理。

  • 相关阅读:
    [美团 CodeM 初赛 Round A]最长树链
    [POI2005]Toy Cars
    [CodePlus2017NOV]晨跑
    [JLOI2011]不重复数字
    [NEERC2007][SHOI2008]Cactus Reloaded
    [NOI2015]软件包管理器
    [HAOI2015]树上操作
    CF1097D Makoto and a Blackboard
    Luogu P5339 [TJOI2019]唱、跳、rap和篮球
    HNCPC2019H 有向图
  • 原文地址:https://www.cnblogs.com/blog-cxj2017522/p/12604404.html
Copyright © 2020-2023  润新知