美文网首页
RN系列之虚拟DOM

RN系列之虚拟DOM

作者: 尹学姐 | 来源:发表于2023-03-20 23:10 被阅读0次

    虚拟DOM是React的一种用于提高渲染效率机制,今天我们来看看虚拟DOM的主要原理。

    为什么要使用虚拟DOM

    传统JQuery的问题

    1. 如果直接操作真实的DOM,每次修改都会造成DOM的重绘和重排。高频操作效率很低。
    2. JS直接操作DOM,效率不高。
    3. model和view耦合。

    React的解决方案

    1. 响应式,数据变化UI自动变化
    2. 使用虚拟DOM,合并频繁操作

    React的虚拟DOM

    React框架核心:React virtual DOM -> 浏览器真实DOM

    使用虚拟DOM树的优点如下:

    • 比较两棵DOM树之后,只动变更的节点。所以Component只需要处理state即可。
    • 虚拟DOM树本质是js对象,生成和比较的效率比真实的DOM树高太多。
    • 比较的也是虚拟的DOM树,然后将变动的部分映射到真实的DOM树上。

    React的setState方法:

    • setState不是马上执行,而是被放入一个队列中,可添加callback来监听state的变化
    • 在update中调用setState可能会引起循环问题

    PureComponent:

    • 目的: 如果state和prop没有发生变化,则不会调用render,减少渲染的次数
    • 原理:在shouldComponentUpdate中进行了一次state和prop的浅比较
    • 浅比较:只比较每一个key两者是否都有,且是否是一个引用。所以只比较了一层而已。

    React数据视图更新原理

    1. state数据
    2. JSX模板(render中定义)
    3. 数据 + 模板生成虚拟DOM(虚拟DOM是一个JS对象,用来描述真实DOM)
      ['div', {id:'abc'}, ['span',{},'hello world']]
    4. 用虚拟DOM的结构生成真实的DOM,来显示
      <div id='abc><span>hello world</span></div>
    5. state发生变化
    6. 数据 + 模板生成新的虚拟DOM
      ['div', {id:'abc'}, ['span',{},'bye bye']]
    7. 比较原始虚拟DOM与新的虚拟DOM的区别,找到区别是span中的内容,diff算法
    8. 直接操作DOM,改变span中的内容

    优点:

    1. 性能提升了,减少了真实DOM的创建和对比,取而代之的是虚拟DOM
    2. 使得跨端应用得以实现,React Native,将虚拟DOM对应到native组件中

    diff算法的核心

    1. 同层比对。确实会造成DOM渲染的浪费,但是会提高比对的效率。
      具体怎么提高?提高了多少?时间复杂度多少?
    2. React引入key值,实现快速比对:
      不要用index作为key值。如果列表变化,index会变化,就无法达到key值快速比对的效果了。
      提高列表渲染效果,需要使用一个稳定的key值。

    响应式设计思想和事件绑定

    • 不要直接操控DOM,操控数据
    • 数据变化,页面自动变化

    常用优化方法

    React最耗性能的地方:update和diff,优化的重点就是减少这两个方法的调用

    • setState优化主要在于非批更新阶段中(timeout/Promise回调),减少setState的触发次数。
    • 为了减少渲染,state和props尽量放需要渲染的数据,不需要渲染的数据使用Context或公共模块(单例服务)变量来实现。
    • 在shouldComponentUpdate中比较props的变化,如果props变化不需要重新渲染,可以在此处拦截

    参考文章

    相关文章

      网友评论

          本文标题:RN系列之虚拟DOM

          本文链接:https://www.haomeiwen.com/subject/fwayrdtx.html