react 浅聊

39 阅读2分钟

一、React Dom 本质

React会先将你的代码换成一个JavaScript对象,然后这个JavaScript对象再转换成真是的DOM。这个JavaScript对象就是所谓的虚拟DOM。

<div>
    <span>Hello ConardLi</span>
    <ul>
       <li>苹果</li>
       <li>橘子</li>
   </ul>
</div>
const VitrualDom = {
    type:'div',
    props: {class: 'title'},
    children: [{
        type: 'span',
        children: 'Hello ConardLi'
    }, {
        type: 'ul',
        children: [{
            type: 'li',
            children: '苹果'
        }, {
            type: 'li',
            children: '橘子'
        }]
    }]
}

二、React Dom 16.0现状

  • React 16.0之前的版本虚拟dom的跟新采⽤的是循环和递归

    • 任务⼀旦开始,⽆法结束,直到任务结束,主线程⼀直被占⽤
    • 导致⼤量组件实例存在时,执⾏效率变低
    • ⽤户交互的动画效果,出现⻚⾯卡顿

三、Fiber

实现原理:

  • 利⽤浏览器空闲时间执⾏,不会⻓时间占⽤主线程
  • 将对⽐更新dom的操作碎⽚化
  • 碎⽚化的任务,可以根据需要被暂停

实现流程: requestIdleCallback是浏览器提供的API,其利⽤浏览器空闲时间执⾏任务,当前任务可被终⽌,优先执⾏更⾼级别的任务

requestIdleCallback(function(deadline){
    // deadline.timeRemaing() 获取浏览器额空余时间
})

对应属性:

image.png

image.png

image.png

image.png

Fiber 实现流程:

  • 将虚拟dom对象构建成Fiber对象
  • 根据fiber对象渲染成真实dom

image.png

image.png

image.png

四、⽣命周期

16.0之前

  • 初始化-挂载props-初始化state-render-完成
  • 获取数据完毕-更新state-diff-render-完成

image.png

image.png

image.png

image.png

  • 组件⾃⼰setState触发更新
  • ⽗组件触发传给⼦组件的props值变化,引发⼦组件更新

shouldComponentUpdate---作用比较新旧props是否相同,相同就return componentWillReceiveProps---父组件重传props时会调用这个方法

image.png

image.png

16.0之后

  • componentWillMount
  • componentWillReceiveProps
  • componentWillUpdate
  • shouldComponentUpdate

image.png

image.png

image.png

五、differ算法

image.png

  • 通过state计算出新的fiber节点
  • 对⽐节点的tag和key确定节点操作(修改,删除,新增,移动)
  • effectTag标记fiber对象
  • 收集所有标记的fiber对象,形成effctList
  • Commit阶段⼀次性处理所有变化的节点

image.png

image.png

image.png