vue子组件向父组件传值问题

  1. 具体应用场景是这样子的,我在 app.vue中有个路由,这个路由会加载c.vue,m来自c.vue,如何把m传给app.vue,我想在app.vue中监听m的变化如何做?就是c.vue中的m值变化,app.vue中也会跟着变化。
<router-link>{{m}}<router-link>

我查到可以用emit触发,但是emit父组件中貌似是要有事件的,如何让c.vue中m变化实时传给app.vue.

阅读 12.2k
4 个回答

用vuex试试。
或者弄个 bus,用 bus.$emit bus.$on

最好是用 vue bus 或者是 vuex,或者是在c.vue里面 $emit 一层一层上去,通知到 App.vue

你的问题可以分成两个点:1. 怎么监听一个值的变化; 2. 怎么从子组件向父组件发送一个值;

使用this.emit向上传值

可以参照下面我打过的例子:

    <div id="app">
        <p>{{total}}</p>
        <button-counter @click="incrementTotal"></button-counter>
        <button-counter @click="incrementTotal"></button-counter>
    </div>

    <script src="https://unpkg.com/vue"></script>
    <script type="text/javascript">
        Vue.component('button-counter', {
            template: '<button @click="incrementCounter">{{counter}}</button>',
            data: function () {
                return {
                    counter: 0
                }
            },
            methods: {
                incrementCounter: function () {
                    this.counter += 1
                    this.$emit('click')
                }
            }
        })

        new Vue({
            el: '#app',
            data: {
                total: 0
            },
            methods: {
                incrementTotal: function () {
                    this.total += 1
                }
            }
        })

使用vuex

vuex话比较简单,你只要声明一个state状态树,mutations以及getters
state用来存储全局状态,mutations用来设置stategetters用来获取state
这样在子组件向父组件传值的话只需要设置相应的state,在父组件就可以直接获取了,如果要监听变化的话最好在父组件再加一个computed属性

以上

你应该在app.vue传递一个对象过去,c.vue用props接受,然后c.vue改变了app.vue会同步变化的,注意是对象之间引用,不要直接改变值。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>/title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <style>

    </style>
    <script src="vue.js"></script>
    <script>
        window.onload=function(){
            new Vue({
                el:'#box',
                data:{
                    giveData:{
                        a:'我是父组件数据'
                    }
                },
                components:{
                    'child-com':{
                        props:['msg'],
                        template:'#child',
                        methods:{
                            change(){
                                //this.msg='被更改了' 不要这样做
                                this.msg.a='被改了'; //传递的是msg,要改变msg.a才能同步
                            }
                        }
                    }
                }
            });
        };
    </script>
</head>
<body>
    <template id="child">
        <div>
            <span>我是子组件</span>
            <input type="button" value="按钮" @click="change">
            <strong>{{msg.a}}</strong>
        </div>
    </template>

    <div id="box">
        父级: ->{{giveData.a}}
        <br>
        <child-com :msg="giveData"></child-com>
    </div>
</body>
</html>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题