加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

8种vue组件通信方式详细解析实例

发布时间:2019-04-10 21:32:09 所属栏目:建站 来源:web秀
导读:对于vue来说,组件是非常常见的,有很多平台都封装了了属于自己一套的组件,如element ui、we ui等等。同时组件之间的消息传递也是非常重要的,下面是我对组件之间消息传递的各种方式的总结,共有8种方式。如有不足之处,可以留言补充,互相学习。 1. prop
副标题[/!--empirenews.page--]

对于vue来说,组件是非常常见的,有很多平台都封装了了属于自己一套的组件,如element ui、we ui等等。同时组件之间的消息传递也是非常重要的,下面是我对组件之间消息传递的各种方式的总结,共有8种方式。如有不足之处,可以留言补充,互相学习。

vue

1. props和$emit

这是最最常用的父子组件通信方式,父组件向子组件传递数据是通过prop传递的,子组件传递数据给父组件是通过$emit触发事件来做到的。 实例:

父组件

  1. Vue.component('parent',{ 
  2.  template:` 
  3.  <div> 
  4.  <p>父组件</p> 
  5.  <child :message="message" v-on:getChildData="getChildData"></child> 
  6.  </div> 
  7.  `, 
  8.  data(){ 
  9.  return { 
  10.  message:'Hello web秀' 
  11.  } 
  12.  }, 
  13.  methods:{ 
  14.  //执行子组件触发的事件 
  15.  getChildData(val){ 
  16.  console.log(val) 
  17.  } 
  18.  } 
  19. }) 
  20. var app=new Vue({ 
  21.  el:'#app', 
  22.  template:` 
  23.  <div> 
  24.  <parent></parent> 
  25.  </div> 
  26.  ` 
  27. }) 

子组件

  1. Vue.component('child',{ 
  2.  //得到父组件传递过来的数据 
  3.  props:['message'], 
  4.  data(){ 
  5.  return { 
  6.  myMessage: this.message 
  7.  } 
  8.  }, 
  9.  template:` 
  10.  <div> 
  11.  <input type="text" v-model="myMessage" @input="passData(myMessage)">  
  12.  </div> 
  13.  `, 
  14.  methods:{ 
  15.  passData(val){ 
  16.  //触发父组件中的事件 
  17.  this.$emit('getChildData',val) 
  18.  } 
  19.  } 
  20. }) 

解析:

  • 父组件传递了message数据给子组件,并且通过v-on绑定了一个getChildData事件来监听子组件的触发事件;
  • 子组件通过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。

C组件

  1. Vue.component('C',{ 
  2.  template:` 
  3.  <div> 
  4.  <input type="text" v-model="$attrs.messageC" @input="passCData($attrs.messageC)"> 
  5.  </div> 
  6.  `, 
  7.  methods:{ 
  8.  passCData(val){ 
  9.  //触发父组件A中的事件 
  10.  this.$emit('getCData',val) 
  11.  } 
  12.  } 
  13. }) 

B组件

  1. Vue.component('B',{ 
  2.  data(){ 
  3.  return { 
  4.  myMessage:this.message 
  5.  } 
  6.  }, 
  7.  template:` 
  8.  <div> 
  9.  <input type="text" v-model="myMessage" @input="passData(myMessage)"> 
  10.  <C v-bind="$attrs" v-on="$listeners"></C> 
  11.  </div> 
  12.  `, 
  13.  //得到父组件传递过来的数据 
  14.  props:['message'], 
  15.  methods:{ 
  16.  passData(val){ 
  17.  //触发父组件中的事件 
  18.  this.$emit('getChildData',val) 
  19.  } 
  20.  } 
  21. }) 

A组件

  1. Vue.component('A',{ 
  2.  template:` 
  3.  <div> 
  4.  <p>this is parent compoent!</p> 
  5.  <B  
  6.  :messageC="messageC"  
  7.  :message="message"  
  8.  v-on:getCData="getCData"  
  9.  v-on:getChildData="getChildData(message)"> 
  10.  </B> 
  11.  </div> 
  12.  `, 
  13.  data(){ 
  14.  return { 
  15.  message:'Hello', 
  16.  messageC:'Hello c' 
  17.  } 
  18.  }, 
  19.  methods:{ 
  20.  getChildData(val){ 
  21.  console.log('这是来自B组件的数据') 
  22.  }, 
  23.  //执行C子组件触发的事件 
  24.  getCData(val){ 
  25.  console.log("这是来自C组件的数据:"+val) 
  26.  } 
  27.  } 
  28. }) 
  29. var app=new Vue({ 
  30.  el:'#app', 
  31.  template:` 
  32.  <div> 
  33.  <A></A> 
  34.  </div> 
  35.  ` 
  36. }) 

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读