• 【React】第七部分 Dom的diffing算法


    【React】第七部分 Dom的diffing算法



    7. Dom的diffing算法


    7.1 虚拟DOM中key的作用

    简单来说:key是虚拟DOM对象的标识,比较的时候通过key去查找对应的虚拟DOM

    详细来说:当状态中的数据发生变化的时候,react会根据新数据生成的新的虚拟DOM,随后进行新旧虚拟DOM的diffing比较,比较的规则如下:

    (1)旧的虚拟DOM找到与新的虚拟DOM相同的key:

    • 如果虚拟DOM的内容没变,直接使用之前的真实DOM
    • 如果虚拟DOM的内容发生变化,则生成新的真实DOM,去替换页面中之前的真实DOM

    (2)旧的虚拟DOM没有找到与新的虚拟DOM相同的key:

    • 则会根据数据创建新的真实DOM,随后渲染到页面上

    7.2 用index作为key可能会引发的问题

    1. 如果对数据进行:逆序添加、逆序删除等破坏顺序的操作,那么就会导致产生没有必要的真实DOM更新,效率低下

    2. 如果结构中包含输入类的DOM,会产生错误的DOM更新,界面会出现问题

    3. 这里需要说明,不是说不可以使用index作为key,如果开发者知道此处不存在对数据的逆序添加、逆序删除等破坏顺序的操作,就可以使用index

    4. 在开发的过程中最好使用能够唯一标识的id作为key,例如身份证、学号、手机号等等

    下面分别举例子

    index作为key值

    在这里插入图片描述

    从图中很容易就看到,后添加的数据打乱了index顺序并且导致了input框中的数据不能一一对应,也被打乱了

    class Demo extends React.Component{
                state = {
                    personArr:[
                        {id:0,name:'Jack',age:25},
                        {id:1,name:'Mark',age:23},
                        {id:2,name:'LiHua',age:20},
                    ]
                }
    
                addPerson = () =>{
                    this.setState({personArr:[{id:3,name:'Jane',age:50},...this.state.personArr]})
                }
    
                render(){
                    return (
                        <div>
                            <ul>
                                {
                                    this.state.personArr.map((item,index)=>{
                                        return <li key={index}>
                                            name: {item.name} -- age: {item.age} -- index: {index}
                                            <input type="text"/>
                                        </li>
                                    })                            
                                }
                            </ul>
                            <button onClick={this.addPerson}>点击添加人员</button>
                        </div>
                    )
                }
            }
    
            ReactDOM.render(<Demo/>,document.getElementById('box'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    id作为key值

    在这里插入图片描述

    class Demo extends React.Component{
                state = {
                    personArr:[
                        {id:0,name:'Jack',age:25},
                        {id:1,name:'Mark',age:23},
                        {id:2,name:'LiHua',age:20},
                    ]
                }
    
                addPerson = () =>{
                    this.setState({personArr:[{id:3,name:'Jane',age:50},...this.state.personArr]})
                }
    
                render(){
                    return (
                        <div>
                            <ul>
                                {
                                    this.state.personArr.map((item,index)=>{
                                        return <li key={item.id}>
                                            name: {item.name} -- age: {item.age} -- id: {item.id}
                                            <input type="text"/>
                                        </li>
                                    })                            
                                }
                            </ul>
                            <button onClick={this.addPerson}>点击添加人员</button>
                        </div>
                    )
                }
            }
    
            ReactDOM.render(<Demo/>,document.getElementById('box'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    总结

    以上就是今天要讲的内容,希望对大家有所帮助!!!

  • 相关阅读:
    基于金豺算法的无人机航迹规划-附代码
    Android 12 桌面去掉搜索框和 隐藏设置搜索框 隐藏应用页的搜索框
    环辛炔衍生物DBCO-NH2,amine,Acid,NHS,Maleimide无铜点击反应
    virtualbox7 虚拟机与宿主机互传文件、共享u盘
    AI不离谱,大语言模型ChatMusician可以理解曲谱生成AI音乐
    【D1 Dock Pro开发板】LED灯闪烁
    360评估应用的6大场景
    《信息安全技术》学习笔记01
    Docker-compose安装mysql
    K8S使用开源CEPH作为后端StorageClass
  • 原文地址:https://blog.csdn.net/Trees__/article/details/126190592