首页 > 语言 > JavaScript > 正文

vue组件之间通信方式实例总结【8种方式】

2024-05-06 15:42:10
字体:
来源:转载
供稿:网友

本文实例总结了vue组件之间通信方式。分享给大家供大家参考,具体如下:

对于vue来说,组件之间的消息传递是非常重要的,下面是我对组件之间消息传递的各种方式的总结,总共有8种方式。

1. props和$emit

父组件向子组件传递数据是通过prop传递的,子组件传递数据给父组件是通过$emit触发事件来做到的。

Vue.component('child',{    data(){      return {        mymessage:this.message      }    },    template:`      <div>        <input type="text" v-model="mymessage" @input="passData(mymessage)"> </div>    `,    props:['message'],//得到父组件传递过来的数据    methods:{      passData(val){        //触发父组件中的事件        this.$emit('getChildData',val)      }    }  })  Vue.component('parent',{    template:`      <div>        <p>this is parent compoent!</p>        <child :message="message" v-on:getChildData="getChildData"></child>      </div>    `,    data(){      return {        message:'hello'      }    },    methods:{      //执行子组件触发的事件      getChildData(val){        console.log(val)      }    }  })  var app=new Vue({    el:'#app',    template:`      <div>        <parent></parent>      </div>    `  })

在上面的例子中,有父组件parent和子组件child。

1).父组件传递了message数据给子组件,并且通过v-on绑定了一个getChildData事件来监听子组件的触发事件;

2).子组件通过props得到相关的message数据,最后通过this.$emit触发了getChildData事件。

2.$attrs和$listeners

第一种方式处理父子组件之间的数据传输有一个问题:如果父组件A下面有子组件B,组件B下面有组件C,这时如果组件A想传递数据给组件C怎么办呢?

如果采用第一种方法,我们必须让组件A通过prop传递消息给组件B,组件B在通过prop传递消息给组件C;要是组件A和组件C之间有更多的组件,那采用这种方式就很复杂了。Vue 2.4开始提供了$attrs和$listeners来解决这个问题,能够让组件A之间传递消息给组件C。

Vue.component('C',{    template:`      <div>        <input type="text" v-model="$attrs.messagec" @input="passCData($attrs.messagec)"> </div>    `,    methods:{      passCData(val){        //触发父组件A中的事件        this.$emit('getCData',val)      }    }  })  Vue.component('B',{    data(){      return {        mymessage:this.message      }    },    template:`      <div>        <input type="text" v-model="mymessage" @input="passData(mymessage)">        <!-- C组件中能直接触发getCData的原因在于 B组件调用C组件时 使用 v-on 绑定了$listeners 属性 -->        <!-- 通过v-bind 绑定$attrs属性,C组件可以直接获取到A组件中传递下来的props(除了B组件中props声明的) -->        <C v-bind="$attrs" v-on="$listeners"></C>      </div>    `,    props:['message'],//得到父组件传递过来的数据    methods:{      passData(val){        //触发父组件中的事件        this.$emit('getChildData',val)      }    }  })  Vue.component('A',{    template:`      <div>        <p>this is parent compoent!</p>        <B :messagec="messagec" :message="message" v-on:getCData="getCData" v-on:getChildData="getChildData(message)"></B>      </div>    `,    data(){      return {        message:'hello',        messagec:'hello c' //传递给c组件的数据      }    },    methods:{      getChildData(val){        console.log('这是来自B组件的数据')      },      //执行C子组件触发的事件      getCData(val){        console.log("这是来自C组件的数据:"+val)      }    }  })  var app=new Vue({    el:'#app',    template:`      <div>        <A></A>      </div>    `  })            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选