vue中 emit实现原理是什么

看到vue子组件像父组件传递数据的方式是:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript" src="vue.js"></script>
</head>
<body>
    <!-- 子组件向父组件传递数据 -->
    <div id="box">
        <v-parent></v-parent>
    </div>

    <!-- 父组件模板 -->
    <template id="parent">
        <div>
            <span>{{msgParent}}</span>
            <v-child @child-info="get"></v-child>
        </div>
    </template>

    <!-- 子组件模板 -->
    <template id="child">
        <div>
            <button @click="send">send</button>
            <!-- <p>{{msgChild}}</p> -->
        </div>
    </template>
    <script type="text/javascript">
        var app = new Vue({
            el:'#box',
            components:{
                // 父组件
                'v-parent':{    
                    data() {
                        return {
                            msgParent:'hello'
                        }
                    },
                    template:'#parent',
                    methods:{
                        get(msg){
                            this.msgParent = msg 
                        }
                    },
                    // 子组件
                    components:{
                        'v-child':{            
                            data(){
                                return {
                                    msgChild:'child'
                                }
                            },
                            template:'#child',
                            methods:{
                                send(){
                                    this.$emit('child-info',this.msgChild)
                                }
                            }
                        }
                    }
                }
            }
        })
    </script>
    
</body>
</html>

看起来就是子组件设置点击事件,然后传值 父组件用参数接收
那这个实现原理是什么 是不是说必须要点击子组件才能进行数据传递?

阅读 12.5k
5 个回答

因为子组件进行传值其父组件应该有一个触发条件
而去知道何时触发可以进行监听在这里你可以使用点击事件也可以是其他的事件
子组件向父组件传递值如果需要父组件去进行显示 那么这个显示条件或者说值得获取一定要有触发的
而原理呢就是事件监听
也可以说是发布订阅模式

理解下 观察者模式

源码中可以看到,emit 其实就是从改组件中绑定的事件events 找到对应的事件上所有的方法,然后遍历执行,你应该去看看vue源码中事件机制就知道了

点击只是触发的时机,你也可以不通过点击触发这个,emit只是一个普通的函数,你想什么时候触发都行

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题