this.$parent获取不到父组件_vue中组件间的通讯

本文详细介绍了Vue中组件间的多种通信方式,包括props和$emit的父传子、子传父通信,$attrs和$listeners的跨级通信,中央事件总线实现非父子组件通信,以及provide和inject的跨层级数据注入。此外,还提到了$parent和$children直接操作父组件和子组件的方法,以及在复杂场景下如何使用Vuex进行状态管理。
摘要由CSDN通过智能技术生成

Vue中组件间的通讯方式

51fd45c9d9660935f16a39a06b48acfb.gif be9bdb513228933c1736f751e7a2ff23.png

props和$emit

51fd45c9d9660935f16a39a06b48acfb.gif

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

从父传给子组件的值 message

在子组件里面设置:

//设置props属性值,得到父组件传递过来的数据。

props:['message'],

//触发父组件中的事件,向父组件传值

  this.$emit('getChildData',val)

在父组件中设置:

//执行子组件触发的事件

getChildData(val){   console.log(val)  }

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

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

$attrs和$listeners

51fd45c9d9660935f16a39a06b48acfb.gif

第一种方式处理父子组件之间的数据传输有一个问题:如果父组件A下面有子组件B,组件B下面有组件C,这时如果组件A想传递数据给组件C怎么办呢?如果采用第一种方法,我们必须让组件A通过prop传递消息给组件B,组件B在通过prop传递消息给组件C;要是组件A和组件C之间有更多的组件,那采用这种方式就很复杂了。Vue 2.4开始提供了$attrs和$listeners来解决这个问题,能够让组件A之间传递消息给组件C。

从父(A)传给子组件的值  message

B组件里面:

      props:["message"]

C组件里面

$attrs.messagec" @input="passCData($attrs.messagec)"> 

C被触发时

在A里面执行C组件passCData里面$emit传过来的函数来to do something()

   $attrs与$listeners(写在要需要获取的子组件上 v-bind="$attrs" v-on="$listeners") 跨过组件传值  //props 里面声名了的就子组件不能获取到了。

中央事件总线

51fd45c9d9660935f16a39a06b48acfb.gif

上面两种方式处理的都是父子组件之间的数据传递,而如果两个组件不是父子关系呢?这种情况下可以使用中央事件总线的方式。新建一个Vue事件bus对象,然后通过bus.$emit触发事件,bus.$on监听触发的事件。

var bus=new Vue();//new 一个bus实例

在需要的地方 发起

      //触发全局事件globalEvent
       bus.$emit('globalEvent',val)

在要触发的地方 绑定

     //绑定全局事件globalEvent

      bus.$on('globalEvent',(val)=>{      

          this.brothermessage=val;
       })

provide和inject

51fd45c9d9660935f16a39a06b48acfb.gif

在 Vue.js 的 2.2.0+ 版本中添加加了 provide 和 inject 选项。他们成对出现,用于父级组件向下传递数据。

父组件中通过provider来提供变量,然后在子组件中通过inject来注入变量。不论子组件有多深,只要调用了inject那么就可以注入provider中的数据。而不是局限于只能从当前父组件的prop属性来获取数据,只要在父组件的生命周期内,子组件都可以调用。

在父组件里面

 provide:{ for:'test'},

在子组件里面

inject:['for'],//得到父组件传递过来的数据

this.for

这样就行了

$parent和$children

51fd45c9d9660935f16a39a06b48acfb.gif

  在组件内部可以直接通过子组件$parent对父组件进行操作,父组件通过$children对子组件进行操作.

在子组件里面

//通过如此调用可以改变父组件的值在父组件里面

 this.$parent.message = this.mymessage;

在父组件里面

 //通过如此调用可以改变子组件里面的值

this.$children[0].mymessage = 'hello';

vuex处理组件之间的数据交互

51fd45c9d9660935f16a39a06b48acfb.gif

如果业务逻辑复杂,很多组件之间需要同时处理一些公共的数据,这个时候才有上面这一些方法可能不利于项目的维护,vuex的做法就是将这一些公共的数据抽离出来,然后其他组件就可以对这个公共数据进行读写操作,这样达到了解耦的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值