DOM中的diff算法详解
admin
2024-02-12 10:16:53
0

经典面试题:

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

import React, { Component } from 'react'export default class ClassHanshu extends Component {constructor() {super()this.state = {persons: [{ id: 1, name: "张三", age: 18 },{ id: 2, name: "张四", age: 19 },]}}// 用index索引作为key时:// 初始数据: // { id: 1, name: "张三", age: 18 },// { id: 2, name: "张四", age: 19 },// 初始虚拟dom// 
  • 张三,18
  • //
  • 张四,19
  • // 页面更新后数据// { id: 3, name: "张五", age: 20 },// { id: 1, name: "张三", age: 18 },// { id: 2, name: "张四", age: 19 },// 页面更新后虚拟dom//
  • 张五,20
  • //
  • 张三,18
  • //
  • 张四,19
  • // 此时新旧虚拟dom根据key进行对比发现里面的内容变了,便替换掉了页面中之前真实的dom,而这意味着两条重复的数据没有重复利用,当数据庞大时效率可想而知add() {const { persons } = this.stateconst p = { id: persons.length + 1, name: "张五", age: 20 }this.setState({persons: [p, ...persons]})}render() {return (
      {this.state.persons.map((personObj, index) => {return
    • {personObj.name},{personObj.age}
    • })}
    )} }
    import React, { Component } from 'react'export default class ClassHanshu extends Component {constructor() {super()this.state = {persons: [{ id: 1, name: "张三", age: 18 },{ id: 1, name: "张四", age: 19 },]}}// 用id作为key时:// 初始数据: // { id: 1, name: "张三", age: 18 },// { id: 2, name: "张四", age: 19 },// 初始虚拟dom// 
  • 张三,18
  • //
  • 张四,19
  • // 页面更新后数据// { id: 3, name: "张五", age: 20 },// { id: 1, name: "张三", age: 18 },// { id: 2, name: "张四", age: 19 },// 页面更新后虚拟dom//
  • 张五,20
  • //
  • 张三,18
  • //
  • 张四,19
  • // 此时新旧虚拟dom根据key进行对比发现没有的便在页面渲染,有的并且内容一样的便用之前真实的domadd() {const { persons } = this.stateconst p = { id: persons.length + 1, name: "张五", age: 20 }this.setState({persons: [p, ...persons]})}render() {return (
      {this.state.persons.map((personObj) => {return
    • {personObj.name},{personObj.age}
    • })}
    )} }

    相关内容

    热门资讯

    腾讯马化腾:微信不搞AI全家桶... IT之家 1 月 26 日消息,据《科创板日报》报道,今日腾讯公司召开年度员工大会,腾讯公司董事会主...
    布米普特拉北京投资基金管理有限... 在近期的达沃斯世界经济论坛上,英伟达首席执行官黄仁勋就人工智能产业的发展现状与未来走向发表了观点。针...
    原创 赵... 经历了婚姻的波动,赵丽颖与冯绍峰的人生轨迹悄然发生了变化,尤其是在对孩子的抚养上,责任感愈加凸显。尽...
    人工智能需求拉动 半导体产业链... A股业绩预告加速披露。与人工智能高度相关的半导体产业链公司2025年业绩表现整体不俗。不少公司在业绩...
    1179亿港元市值!东大37岁... 文 | 创客公社施润 37岁东大校友,干出AI企业最快IPO,公司市值高达1179.27亿港元! 近...
    开年即冲刺!珠海高新45个项目... 1月26日上午,珠海高新区举行2026年一季度重点项目签约仪式,英飞源、鹏城新能、元泰丰、巴山泓等4...
    2025年银行理财市场存续规模... 日前,银行业理财登记托管中心发布《中国银行业理财市场年度报告(2025年)》。截至2025年末,银行...
    全球“中等强国”联合“抗霸”:... 加拿大总理卡尼在达沃斯发表了一篇震撼全球的演说,他呼吁全球“中等强国”面对现实,联合起来“抗霸”。这...
    原创 期... 众所周知,很多公司都在通过期权来绑定人才。 比如雷军做小米手机的时候就想找一批志同道合、跟公司同进退...
    肯德基回应涨价:调整部分外送产... “肯德基涨价”的消息引发关注。1月26日起,肯德基对部分外送产品价格做出小幅调整,平均调整金额为0....
    上期所批复同意5家银行为从事境... 据上海期货交易所1月26日消息,上海期货交易所于2026年1月26日批复同意中国工商银行股份有限公司...
    万亿市值油气巨头,股价历史新高 26日,油气板块盘中走强,中国海油涨超6%,盘中股价一度达到33.49元/股,创历史新高,最新总市值...
    央行:下调0.25个百分点 今天(1月15日)下午,国务院新闻办公室举行新闻发布会,介绍货币金融政策支持实体经济高质量发展成效。...
    周鸿祎剧透360将发布“短剧智... 在近日举行的2026崇礼论坛上,360集团创始人周鸿祎发表名为《从大模型到百亿智能体时代——AI进化...
    香港加速构建国际黄金交易枢纽:... 香港加速构建国际黄金交易枢纽:三年内仓储容量目标超2000吨,首支本地黄金基金即将上市 2026年...
    金价突破5100美元关口!有人... 1月26日,黄金价格再度刷新历史新高。美国东部时间1月25日傍晚,纽约商品交易所2月黄金期货价格在电...
    乳业唯一!国家级乳品精深加工实... 近日,农业农村部批复公布新一批企业重点实验室建设名单,由蒙牛集团牵头申报的“农业农村部乳品精深加工重...
    5年上市未果的吉香居易主,这次... 2026年1月20日,重庆市市场监督管理局公示的经营者集中简易案件显示,悄然揭开了中国调味品行业新年...
    Transformer作者创办... 当一家公司愿意投资自己曾经的员工创办的初创企业时,这通常说明两件事:一是前员工确实做出了值得关注的东...
    新基金发行继续回暖 2026年... 2026年开年以来,在A股结构性行情的持续驱动下,已有超过200只基金年内业绩回报超过20%。基金业...