写点什么

Vue

作者:wudaxue
  • 2022 年 3 月 28 日
  • 本文字数:1301 字

    阅读完需:约 4 分钟

Vue 源码解析事件派发

$on:

Vue.prototype.$on = function(event, fn) {	const vm = this  if (Array.isArray(event)) {  	for (let i = 0; i < event.length; i++) {    	vm.$on(event[i], fn)    }  } else {    // 之前已经有监听event的事件,则将此次监听的回调函数添加到其数组中,否则创建一个新数组并添加fn  	(vm._event[event] || vm._event[event] = 0).push(fn)  }  return vm}
复制代码

$off:

Vue.prototype.$off = function(event, fn) {	const vm = this 	if (!arguments.length) {    // 如果没有传参数,则清空所有事件的监听函数  	vm._events = Object.create(null)    return vm  }   // 如果传的event是数组,则对该数组里的每个事件再递归调用$off方法  if (Array.isArray(event)) {  	for (let i = 0; i < event.length; i++) {    	vm.$off(event[i], fn)    }    return vm  }  //获取当前event里所有的回调函数  const cbs = vm._events[event]  //如果不存在回调函数,则直接返回,因为没有可以移除监听的内容  if (!cbs) return vm  //如果没有指定要移除的回调函数,则移除该事件下所有的回调函数  if (!fn) {  	vm._events[event] = null    return null  }  //指定了要移除的回调函数  let cb   let i = cbs.length  while (i--) {  	cb = cbs[i]    //在事件对应的回调函数数组里面找出要移除的回调函数,并从数组里移除    if (cb === fn || cn.fn === fn) {    	cbs.splice(i, 1)      break    }  }  return vm}
复制代码

$emit:

Vm.prototype.$emit = function(event) {	const vm = this 	//拿出触发事件对应的回调函数列表  let cbs = vm._events[event]  if (cbs) {  	//$emit方法可以传参,这些参数会在调用回调函数的时候传进去    const args = toArray(arguments, 1)  	//遍历回调函数列表,调用每个回调函数    for (let i = 0; i < cbs.lenght; i++) {    	cbs[i].apply(vm, args)    }  }  return vm}
复制代码

$once:

  Vue.prototype.$once = function (event, fn) {    const vm = this    // 封装一个高阶函数on,在on里面调用fn    function on () {      // 每当执行了一次on,移除event里的on事件,后面再触发event事件就不会再执行on事件了,也就不会执行on里面的fn事件      vm.$off(event, on)      // 执行on的时候,执行fn函数      fn.apply(vm, arguments)    }    // 这个赋值是在$off方法里会用到的    // 比如我们调用了vm.$off(fn)来移除fn回调函数,然而我们在调用$once的时候,实际执行的是vm.$on(event, on)    // 所以在event的回调函数数组里添加的是on函数,这个时候要移除fn,我们无法在回调函数数组里面找到fn函数移除,只能找到on函数    // 我们可以通过on.fn === fn来判断这种情况,并在回调函数数组里移除on函数    on.fn = fn    // $once最终调用的是$on,并且回调函数是on    vm.$on(event, on)    return vm  }
复制代码

vue 中 key 的作用

key 的作用主要是为了高效的更新虚拟 DOM)

Vue中 key 值的作用

vue中key的作用和工作原理

为什么 Vue 中不要用 index 作为 key?(diff 算法详解)

用户头像

wudaxue

关注

wudaxue 2020.11.26 加入

简简单单 干干净净 明明白白

评论

发布
暂无评论
Vue_wudaxue_InfoQ写作平台