React-diff算法原理以及优化

简介: React-diff算法原理以及优化

1. React的渲染流程

  • 如果是HTML标签则直接渲染真实DOM
  • 如果是JSX,则按以下流程进行
    1.将JSX转换成createElement
    2.执行createElement创建虚拟DOM, 得到虚拟DOM树
    3.根据虚拟DOM树在界面上生成真实DOM
    React渲染流程
  • 执行render方法

<div>
    <div><p>我是段落</p></div>
    <div><span>我是span</span></div>
</div>
  • 将JSX转换成createElement

React.createElement("div", null,
    React.createElement("div", null,
        React.createElement("p", null, "我是段落")),
    React.createElement("div", null,
        React.createElement("span", null, "我是span"))
);
  • 执行createElement创建虚拟DOM, 得到虚拟DOM树

{
 targetName: 'div',
 children:[
    {
     targetName: 'div',
     children:[
        {
         targetName: 'p'
        }
     ]
    },
    {
     targetName: 'div',
     children:[
        {
         targetName: 'span'
        }
     ]
    }
 ]
}
- 根据虚拟DOM树在界面上生成真实DOM

2.React更新流程

使用diff算法

30.png

diff算法比较原则.png


29.png

实例.png


1.列表渲染优化

由于diff算法在比较的时候默认情况下只会进行同层同位置的比较

所以在渲染列表时可能会存在性能问题

28.png

性能提升问题.png


2.如何让diff算法递归比较同层所有元素?

给列表元素添加独一无二的key,告诉React除了和同层同位置比, 还需要和同层其它位置比

https://zh-hans.reactjs.org/docs/reconciliation.html#the-diffing-algorithm

class Home extends React.Component{
    constructor(props){
        super(props);
        this.state = {
            heroList : ['鲁班', '虞姬', '黄忠']
        }
    }
    render(){
        return (
            <div>
                <ul>{
                    this.state.heroList.map(name=>{
                        return <li key={name}>{name}</li>
                    })
                }</ul>
                <button onClick={()=>{this.btnClick()}}>按钮</button>
            </div>
        )
    }
    btnClick(){
        this.setState({
            // heroList: [...this.state.heroList, '阿珂']
            heroList: ['阿珂', ...this.state.heroList]
        })
    }
}



目录
相关文章
|
3月前
|
机器学习/深度学习 算法 数据可视化
基于MVO多元宇宙优化的DBSCAN聚类算法matlab仿真
本程序基于MATLAB实现MVO优化的DBSCAN聚类算法,通过多元宇宙优化自动搜索最优参数Eps与MinPts,提升聚类精度。对比传统DBSCAN,MVO-DBSCAN有效克服参数依赖问题,适应复杂数据分布,增强鲁棒性,适用于非均匀密度数据集的高效聚类分析。
|
4月前
|
机器学习/深度学习 传感器 算法
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
315 14
|
3月前
|
机器学习/深度学习 算法
采用蚁群算法对BP神经网络进行优化
使用蚁群算法来优化BP神经网络的权重和偏置,克服传统BP算法容易陷入局部极小值、收敛速度慢、对初始权重敏感等问题。
384 5
|
4月前
|
canal 算法 vr&ar
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
161 1
|
3月前
|
机器学习/深度学习 人工智能 算法
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
193 0
|
4月前
|
机器学习/深度学习 运维 算法
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
271 1
|
3月前
|
机器学习/深度学习 算法 物联网
基于遗传方法的动态多目标优化算法
基于遗传方法的动态多目标优化算法
|
4月前
|
机器学习/深度学习 存储 算法
【微电网调度】考虑需求响应的基于改进多目标灰狼算法的微电网优化调度研究(Matlab代码实现)
【微电网调度】考虑需求响应的基于改进多目标灰狼算法的微电网优化调度研究(Matlab代码实现)
194 0
|
4月前
|
存储 边缘计算 算法
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
101 0