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

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

发布时间:2019-04-11 05:44:23 所属栏目:建站 来源: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. }) 

(编辑:河北网)

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

热点阅读