好记性不如烂笔头之React Fiber(一)

263 阅读2分钟

1、为什么要引入React Fiber,为了解决什么问题
2、如何解决的
3、引入了React Fiber以后有什么变化

React Fiber解决什么问题?

因为之前的结构会造成页面卡顿。

为什么会造成页面卡顿??

react中调用render和setState方法来进行渲染和更新。主要包含两个阶段:

  • reconciler调度阶段:会进行自顶向下的递归算法,遍历数据生成新的virtual DOM。通过diff算法,找到需要更新的元素,放到更新队列中。这个策略是无法中断的,一旦开始,必须等到整课virtualTree计算完成后,才会将任务出栈释放主线程。但是浏览器的渲染引擎是单线程的,如果在这个时候主线程上有用户交互或者动画任务的话,无法立即处理,影响体验。
  • 渲染阶段:根据所在的渲染环境,遍历更新队列,调用渲染宿主环境的API,将对应的元素更新渲染,

React Fiber如何解决页面卡顿问题

将调度阶段分为一系列小任务。每一次加入一个节点到任务中,做完以后看是否还有时间继续下一个任务,如果有就继续。没有就将自己挂起,在主线程不忙的时候在继续。每次只做一小段,做完一段就把时间控制权还给主线程。而不是像之前长时间占用,从而实现对任务的暂停、恢复、灵活控制。 这里的节点就是Fiber Node。

引入了Fiber后的变化-生命周期的变化

在未引入Fiber之前,我们的生命周期是这样的:

引入Fiber后,将任务分为一个个小节点,可能会在render之前被中断/恢复。导致render之前的生命周期发生被多次执行。

所以我们废弃了render之前的三个生命周期

  • componentWillMount
  • componentwillRecieveProps
  • componentWillUpdate

取代:

var LIFECYCLE_SUGGESTIONS = {
  UNSAFE_componentWillMount: 'componentDidMount',
  UNSAFE_componentWillReceiveProps: 'static getDerivedStateFromProps',
  UNSAFE_componentWillUpdate: 'componentDidUpdate'
};

给出的解决方案,增加了两个新的生命周期:

  • getDerivedStateFromProps取代will生命周期
  • getSnapshotBeforeUpdate 在render之后执行。DOM元素还没更新时,给一个机会获取DOM信息,计算得到snapshot

生命周期变为:

所有内容皆非原创,原创请看:zhuanlan.zhihu.com/p/44942360