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}
    • })}
    )} }

    相关内容

    热门资讯

    一季度增长12.2%后,王莉定... 来源:茅台时空 据茅台官微报道,茅台酱香系列酒一季度交出营业收入78.8亿元、同比增长12.2%的成...
    曦智科技沈亦晨:将与上海国资联... 曦智科技创始人、董事长沈亦晨 图片来源:主办方供图 5月10日,上海曦智科技创始人、董事长沈亦晨出现...
    东实环境“还贷式IPO”困境:... 图源:图虫创意 来源|时代商业研究院 作者|特约研究员赖钧洪、郑琳 编辑|郑琳 作为东莞市国资委10...
    为什么是宁波?扛起中国五金出口... 中国作为全球最大的五金制品生产国和出口国,正以绿色转型、品牌出海为方向,在全球五金供应链中占据核心地...
    微信:关于开展涉税虚假宣传信息... 近期,平台接到用户投诉举报,发现个别账户发布“纳税15万,国家补贴5万”“4月恢复核定征收”等涉税虚...
    央视调查:AI“买家秀”误导消... IT之家 5 月 10 日消息,据央视新闻今日报道,在网购场景中,由于消费者无法直接接触商品,所以评...
    (机遇香港)“温情经济”升温 ... 中新社香港5月10日电 (记者 邱兆翔)5月10日是母亲节。在香港,不少子女与父母一早出门饮茶庆祝,...
    原创 3... 5月8日,彭博社一段视频访谈把华尔街炸了。有"新债王"之称的双线资本创始人冈拉克,公开承认自己已经在...
    网点关停潮?一半全国性银行机构... 营业网点是商业银行经营的最小细胞,也是直接触达客户、创造价值的核心战场,其竞争力直接关系到银行经营效...
    粮农组织:战火阴影下4月全球食... 来源:财联社 联合国粮农组织(FAO)周五指出,由于中东局势紧张及霍尔木兹海峡反复被封,全球粮食价格...
    原创 帮... 老铁们,帮主又来了。今天聊个事儿,保证让你觉得,原来国家战略离你的钱包可以这么近!四部门刚发了个文,...
    吸引全球资本,亚洲新一轮“超级... 投资者正将目光转向亚洲,寻找全球股市上涨行情的下一个突破口。 在人工智能浪潮驱动下,韩国股市本月涨幅...
    越秀区多维经营账服务细致入微的... 越秀区多维经营账服务细致入微的代理机构参考 在广州越秀区这一商贸活跃的核心区域,中小企业对财税服务...
    教人挣钱的自媒体平台叫什么 教人挣钱的自媒体平台叫什么?这问题问得太到位了。说实话,我也曾经翻遍全网、踩过无数坑,就为了找一个真...
    湖人被无情戏耍又是三节崩 里夫... 与雷霆的半决赛打到第三场,一种无望的情绪已彻底裹挟了湖人全队,彻底无法被摆脱了。 所有人都清楚,湖人...
    原创 欧... 据环球网综合报道,欧盟正处于前所未有的抉择压力之下。在俄乌冲突延续近四年的沉重阴影下,欧盟内部关于援...
    原创 1... 雷达财经出品 文|丁禹 编|孟帅 五一假期刚刚结束,市值百亿的川酒上市公司水井坊,其核心管理层再次迎...
    美银Hartnett:材料板块... 美银证券首席投资策略师Michael Hartnett在最新报告中点名材料板块,称其将是下一个“牛市...
    情绪消费的好日子,还剩多久 文|强调Next 2025年是中国潮玩行业最热闹的一年,也是从业者最难熬的一年。 热闹是真的热闹。...