• DOM中的diff算法详解


    经典面试题:

    1.react/vue中的key有什么作用?key的内部原理是什么?

    2.为什么遍历列表时,key最好不要用index?

    看完以下内容,轻松解决你对diff算法的认识以及以上两个常问问题。

    虚拟DOM中key的作用:

    1.当数据状态发生变化时,react/vue会根据新数据生成新的虚拟dom,随后会进行新旧dom的比较,比较规则如下:

    ①旧虚拟dom中找到了新虚拟dom相同的key:

    (1)若虚拟dom中内容没变,直接使用之前的真实dom

    (2)若虚拟dom中内容变了,则生成新的真实dom,并替换掉页面中之前的真实dom

    ②旧虚拟dom中未找到新虚拟dom相同的key:

    (1)根据数据创建新的真实的dom,并渲染到页面

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

    ①若数据进行:逆序添加、逆序删除等破坏顺序的操作,此时会产生没有必要的真实的dom更新,虽然界面效果没什么问题,但效率低

    ②如果结构中还包含输入类的dom,会产生错误dom更新,界面会发生问题

    ③注意:如果不存在数据的逆序添加,逆序删除等破坏顺序性操作,仅用于渲染列表到页面,一般是没有问题的

    3.开发中如何选择key值

    ①最好使用每条数据的唯一标识作为key,如id,身份证号等

    ②如果确定只是简单的展示数据,也可以用index

    1. import React, { Component } from 'react'
    2. export default class ClassHanshu extends Component {
    3. constructor() {
    4. super()
    5. this.state = {
    6. persons: [
    7. { id: 1, name: "张三", age: 18 },
    8. { id: 2, name: "张四", age: 19 },
    9. ]
    10. }
    11. }
    12. // 用index索引作为key时:
    13. // 初始数据:
    14. // { id: 1, name: "张三", age: 18 },
    15. // { id: 2, name: "张四", age: 19 },
    16. // 初始虚拟dom
    17. // <li key=0>张三,18li>
    18. // <li key=1>张四,19li>
    19. // 页面更新后数据
    20. // { id: 3, name: "张五", age: 20 },
    21. // { id: 1, name: "张三", age: 18 },
    22. // { id: 2, name: "张四", age: 19 },
    23. // 页面更新后虚拟dom
    24. // <li key=0>张五,20li>
    25. // <li key=1>张三,18li>
    26. // <li key=2>张四,19li>
    27. // 此时新旧虚拟dom根据key进行对比发现里面的内容变了,便替换掉了页面中之前真实的dom,而这意味着两条重复的数据没有重复利用,当数据庞大时效率可想而知
    28. add() {
    29. const { persons } = this.state
    30. const p = { id: persons.length + 1, name: "张五", age: 20 }
    31. this.setState({
    32. persons: [p, ...persons]
    33. })
    34. }
    35. render() {
    36. return (
    37. <div>
    38. <button onClick={() => { this.add() }}>点击添加一个张五button>
    39. <ul>
    40. {
    41. this.state.persons.map((personObj, index) => {
    42. return <li key={index}>{personObj.name},{personObj.age}li>
    43. })
    44. }
    45. ul>
    46. div>
    47. )
    48. }
    49. }
    1. import React, { Component } from 'react'
    2. export default class ClassHanshu extends Component {
    3. constructor() {
    4. super()
    5. this.state = {
    6. persons: [
    7. { id: 1, name: "张三", age: 18 },
    8. { id: 1, name: "张四", age: 19 },
    9. ]
    10. }
    11. }
    12. // 用id作为key时:
    13. // 初始数据:
    14. // { id: 1, name: "张三", age: 18 },
    15. // { id: 2, name: "张四", age: 19 },
    16. // 初始虚拟dom
    17. // <li key=1>张三,18li>
    18. // <li key=2>张四,19li>
    19. // 页面更新后数据
    20. // { id: 3, name: "张五", age: 20 },
    21. // { id: 1, name: "张三", age: 18 },
    22. // { id: 2, name: "张四", age: 19 },
    23. // 页面更新后虚拟dom
    24. // <li key=3>张五,20li>
    25. // <li key=1>张三,18li>
    26. // <li key=2>张四,19li>
    27. // 此时新旧虚拟dom根据key进行对比发现没有的便在页面渲染,有的并且内容一样的便用之前真实的dom
    28. add() {
    29. const { persons } = this.state
    30. const p = { id: persons.length + 1, name: "张五", age: 20 }
    31. this.setState({
    32. persons: [p, ...persons]
    33. })
    34. }
    35. render() {
    36. return (
    37. <div>
    38. <button onClick={() => { this.add() }}>点击添加一个张五button>
    39. <ul>
    40. {
    41. this.state.persons.map((personObj) => {
    42. return <li key={personObj.id}>{personObj.name},{personObj.age}li>
    43. })
    44. }
    45. ul>
    46. div>
    47. )
    48. }
    49. }

  • 相关阅读:
    机器学习深度解析:原理、应用与前景
    《web课程设计》用HTML CSS做一个简洁、漂亮的个人博客网站
    Win10找不到便签怎么办 Win10找不到便签解决方法
    基于python的驾校管理系统的设计与实现
    食堂用户菜品关系系统(C语言课设)
    从 Hadoop 到云原生, 大数据平台如何做存算分离
    javaWeb—JavaScript
    LVM逻辑卷
    舆情监测是什么?对企业营销来说有什么作用?
    IDEA使用技巧(常用设置、快捷键等)
  • 原文地址:https://blog.csdn.net/qq_72760247/article/details/128024096