layui input change事件_React Fiber的优先级调度机制与事件系统

本文探讨React的事件系统,特别是Fiber的优先级调度机制。React的事件绑定在JSX中进行,事件分派通过DiscreteEvent、UserBlockingEvent、ContinuousEvent三类进行,每类事件有不同的处理策略。重点讲解了离散事件的处理,包括flushDiscreteUpdates和discreteUpdates,以及runWithPriority在调度器中的作用,如何影响fiber的expirationTime和priorityLevel,从而实现高效的时间切片和更新策略。
摘要由CSDN通过智能技术生成

经典的事件系统分成两大块,绑定事件与分派事件,在浏览器中,分派事件很少人会直接dispatchEvent。因为创建一个DOM 事件是非常复杂的事情,不同的事件对象对应不同的事件构造器,传参也五花八门。因为分派事件基本上用户行为触发,比如我们点击了某个元素,恰逢在这上方绑定了点击事件,于是触发了。

React的绑定事件是在JSX 中进行,换言之, render时,props的onXXX事件就被收集起来,进行绑定。在jQuery时,人们发明了事件委托,将可以冒泡的事件挂在document或window对象上,进行统一的监听,实现高性能的事件系统。现在我们可以无视IE8 ,因此对不可冒泡的事件可以使用事件捕获,对能冒泡的事件使用事件冒泡,也是放在顶层对象 上进行监听。

function trapBubbledEvent(topLevelType, element) {
      //by 司徒正美
  trapEventForPluginEventSystem(element, topLevelType, false);
}
function trapCapturedEvent(topLevelType, element) {
    
  trapEventForPluginEventSystem(element, topLevelType, true);
}

大家可能觉得很奇怪,浏览器的dom.addEventListener(type, fn, capture) 怎么也要三个参数, 原因是fn是一个统一调度的方法,因此可省掉一个。而冒泡与捕获则通过不同的方法做区分,实际干活的是trapEventForPluginEventSystem。

trapEventForPluginEventSystem根据事件名进行分大三类,DiscreteEvent,UserBlockingEvent,ContinuousEvent,选出不同的事件派发器。

function trapEventForPluginEventSystem(element, topLevelType, capture) {
     //by 司徒正美
  var listener;

  switch (getEventPriority(topLevelType)) {
    
    case DiscreteEvent:
      listener = dispatchDiscreteEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM);
      break;

    case UserBlockingEvent:
      listener = dispatchUserBlockingUpdate.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM);
      break;

    case ContinuousEvent: //by 司徒正美
    default:
      listener = dispatchEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM);
      break;
  }

  var rawEventName = getRawEventName(topLevelType);

  if (capture) {
    
    addEventCaptureListener(element, rawEventName, listener);
  } else {
    
    addEventBubbleListener(element, rawEventName, listener);
  }
}

DiscreteEvent 离散事件. 例如blur、focus、 click、 submit、 touchStart. 这些事件都是离散触发的。

UserBlockin

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值