湛蓝之海 发表于 2021-12-27 16:09:53

#yyds干货盘点#16.父子组件事件通信

一、父子组件间通信
组件之间必然需要相互通信:

[*]父组件可能要给子组件下发数据
[*]子组件则可能要将它内部发生的动态行为告知父组件
[*]非父子组件之间也可能会有数据和行为的通信

<!-- 父组件向子组件传递数据-->
<my-component :items="users"></my-component>Vue.component('my-component', {
template: `
    <div><button @click="myclick">单击以触发父元素更新</button></div>
`,
methods: {
    myclick: function(){
   
    }
}
});

[*]父元素通过 props 向子组件传递数据
[*]子组件通过 事件 给父组件触发更新行为


二、父子组件间事件通信
子组件向父组件发送消息,使用Vue自定义事件机制

[*]子组件使用 $emit 向父组件触发事件
[*]父组件使用 $on 或 v-on 监听子组件事件

Vue.component('my-component', {
template: '#my-component',
props: ['value'],
methods: {
    emitEvent: function(){
      console.log('child component click event');
      this.$emit('childevent');
    }
}
});<div id="app">
<my-component @childevent="handleEvent"></my-component>
</div>

[*]子组件向父组件发送事件消息时,可以一并传递其它附加数据
[*]父组件直接在事件监听函数中通过形参获取这些附加数据参数(也可以使用 arguments [ ] 数组接收)

emitEvent: function() {
this.$emit('childevent', '附加数据')
}handleEvent: function() {
console.log(arguments);
}
三、父子组件间通信(HTML代码)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>父子组件间通信</title>
</head>
<body>
    <div id="app">
      <!-- 使用组件 -->
      <my-component :message="message" @my-component-event="handleMyComponentEvent"></my-component>
      <h6>父元素内容</h6>
      <p>message=={{message}}</p>
   
   
    </div>

    <template id="my">
      <div>
            <p>message={{message}}</p>
            <p>
                <button @click="handleClick">点击以更新父元素</button>
            </p>
      </div>
    </template>

    <script src="vue.js"></script>
    <script>
      //创建组件
      const myComponent = {
            template: '#my',
            //props接收父元素数据
            props: ['message'],
            //方法
            methods: {
                handleClick:function(){
                  //向父元素发射事件消息
                  //参数1:表示自定义事件的名称
                  //自定义事件的名称要使用短横线连接形式
                  //参数2:表示传递给父元素附加数据
                  this.$emit('my-component-event','update message from child');
                }
            }
      }
      //Vue实例对象
      var vm = new Vue({
            el: '#app',
            data: {
                message : 'from parent'
            },
            //注册组件
            components: {
                myComponent
            },
            //父元素methods
            methods: {
                //接收到子组件的自定义事件并处理之
                handleMyComponentEvent: function(param){
                  console.log('接收到了子组件触发的事件');
                   //this.message = param;
                   this.message=arguments;
                }
            }
      });
    </script>
</body>
</html>注:一定要引入Vue.js​​点击链接下载开发版或生产版本在html中引入即可​​


https://blog.51cto.com/u_15173612/4848005
页: [1]
查看完整版本: #yyds干货盘点#16.父子组件事件通信