vue3的emit,vue v-on原理

  vue3的emit,vue v-on原理

  本文主要介绍Vue中$on和$emit的实现原理分析,有很好的参考价值,希望对大家有所帮助。如有错误或不足之处,请不吝赐教。

  

目录

  emit和关于Vue中发布和订阅模式的用法。首先,分析$on的原理和实现。有一点要记住,先定义,先触发,先分析,$emit,先做个断点。

  

Vue中发布订阅模式

  在Vue中,采用发布-订阅模式,兄弟组件之间典型的通信是$on和$emit。

  发布订阅模式:(订阅者、发布者、信号中心)

  发布者$emit将事件发布到信号中心eventBus,订阅者$on通过信号中心接收事件并进行处理。

  在此模拟自定义事件$on和$emit。

  事件总线类{

  构造函数(){

  //1.处理与事件对应的处理函数。

  this.sub={}

  }

  $on(事件,fn){

  如果(!this.sub[event]){

  //2.确定sub是否已经有了事件,如果没有,分配一个数组来存储触发函数。

  this.sub[event]=[]

  }

  //3.将函数推送到相应的事件

  这个事件。推动(fn)

  }

  $emit(事件){

  if(this.sub[event]){

  这个事件。forEach(fn={

  Fn() //4。在相应的事件中执行处理功能。

  })

  }

  }

  }

  //信号中心

  const vm=新事件总线()

  //订阅事件

  Vm。$on(click ,()={ console . log( click事件被触发)})

  VM。$ on(更改,()={console.log(更改事件被触发)})

  //发布订阅

  vm。$emit(click )

  vm。$emit(change )

  

$emit和$on用法深挖

  俗称e m i t和emit和emit等是消费和定义。我们用代码解释一下。

  身体

  div id=应用程序

  按钮@click=添加测试/按钮

  /div

  脚本

  var vm=new Vue({

  埃尔: #app ,

  数据:{

  消息:“好的”

  },

  已创建(){

  这个。$on(我的事件,this.datalist)

  },

  方法:{

  数据表(e){

  console.log(this.message,e);

  },

  add(){

  这个。$emit(我的事件,你好吴)

  }

  }

  });

  /脚本

  /body

  

首先剖析一下$on的原理实现

  首先在创建时添加断点。

  我们会发现他会跳到on的源代码里。

  我们传入两个参数,第一个是我们事件的名称,第二个是我们事件处理方法对应的event和fn。

  首先,他将这个传递给vm,然后判断事件是否是一个数组。如果是数组,他会循环赋值,继续执行on的迭代方法。如果不是数组进入else的逻辑判断,找出是否包含事件。如果没有,他会自己创建一个事件,设置为空数组,将新创建的处理函数推送到里面。这说明我们在定义一个事件的时候,可以同时为一个事件定义多个执行方法,最后找到定义的方法,返回定义第二个方法。参见代码var vm=new Vue({

  埃尔: #app ,

  数据:{

  消息:“好的”

  },

  已创建(){

  这个。$on(我的事件,this.datalist)

  这个。$on(我的事件,this.datalist2)

  },

  方法:{

  数据表(e){

  console.log(this.message,e);

  },

  数据列表2(e){

  Console.log(我是第二种方法,e);

  },

  add(){

  这个。$emit(我的事件,你好吴)

  }

  }

  });

  定义多个执行方法也是可以的。

  

有一点要记住先定义的先触发

  还有一点可以是数组,同样的处理方法绑定到不同的事件,如下面的代码所示

  var vm=new Vue({

  埃尔: #app ,

  数据:{

  消息:“好的”

  },

  已创建(){

  这个。$on([我的事件,我的事件2],this.datalist)

  console.log(这个。_ events);

  //这个。$on(我的事件,this.datalist2)

  },

  方法:{

  数据表(e){

  console.log(this.message,e);

  },

  数据列表2(e){

  Console.log(我是第二种方法,e);

  },

  add(){

  这个。$emit(my_event2 ,你好吴)

  }

  }

  });

  换成第二个数组他还是可以实现的。

  

分析$emit

  

先打个断点

  1 .发出源代码

  2.关键步骤:先把名字改成小写,然后直接从我们vue实例中带下划线的events对象中取出事件对应的方法。如果什么都找不到,就回去。如果找到了,第一步就是判断cbs的长度能不能为1,因为它可能是一个数组。如果多个处理函数大于1,就变成数组,如果等于1,就直接返回cbs。

  在第二步中,他处理参数并将下面的参数转换成数组。他不想要第一个,因为他用完了事件名称,然后他在cbs上循环播放。

  这个函数是为了捕捉和处理异常,执行try catch,所以如果执行emit出现错误,他不会崩溃,会抛出错误。这个地方做得很好,最后返回res。

  总结

  通过源码可以事半功倍。

  通过源代码分析,我们知道在定义on方法时,可以定义多个事件,将多个处理函数绑定到同一个事件,也可以是定义中的数组。

  Trycate是在emit中处理的,所以当我们抛出异常时,不会中断整个程序而崩溃。

  以上个人经历,希望能给大家一个参考,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: