保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

40行代码实现React核心Diff算法

  Diff算法的设计思路
  试想,Diff算法需要考虑多少种情况呢?大体分三种,分别是:
  节点属性变化,比如:更新前ullikey0classNamebefore0lilikey11liul更新后ullikey0classNameafter0lilikey11liul节点增删,比如:更新前ullikey00lilikey11lilikey22liul更新后情况1新增节点ullikey00lilikey11lilikey22lilikey33liul更新后情况2删除节点ullikey00lilikey11liul节点移动,比如:更新前ullikey00lilikey11liul更新后ullikey11lilikey00liul
  该如何设计Diff算法呢?考虑到只有以上三种情况,一种常见的设计思路是:
  首先判断当前节点属于哪种情况如果是增删,执行增删逻辑如果是属性变化,执行属性变化逻辑如果是移动,执行移动逻辑
  按这个方案,其实有个隐含的前提不同操作的优先级是相同的。但在日常开发中,节点移动发生较少,所以Diff算法会优先判断其他情况。
  基于这个理念,主流框架(React、Vue)的Diff算法都会经历多轮遍历,先处理常见情况,后处理不常见情况。
  所以,这就要求处理不常见情况的算法需要能给各种边界case兜底。
  换句话说,完全可以仅使用处理不常见情况的算法完成Diff操作。主流框架之所以没这么做是为了性能考虑。
  本文会砍掉处理常见情况的算法,保留处理不常见情况的算法。
  这样,只需要40行代码就能实现Diff的核心逻辑。
  Demo介绍
  首先,我们定义虚拟DOM节点的数据结构:
  typeFlagPlacementDeletion;interfaceNode{key:string;flag?:Flag;index?:number;}
  key是node的唯一标识,用于将节点在变化前、变化后关联上。
  flag代表node经过Diff后,需要对相应的真实DOM执行的操作,其中:
  Placement对于新生成的node,代表对应DOM需要插入到页面中。对于已有的node,代表对应DOM需要在页面中移动Deletion代表node对应DOM需要从页面中删除
  index代表该node在同级node中的索引位置
  注:本Demo仅实现为node标记flag,没有实现根据flag执行DOM操作。
  我们希望实现的diff方法,接收更新前与更新后的NodeList,为他们标记flag:typeNodeListNode〔〕;functiondiff(before:NodeList,after:NodeList):NodeList{。。。代码}
  比如对于:更新前constbefore〔{key:a}〕更新后constafter〔{key:d}〕diff(before,after)输出〔{key:d,flag:Placement},{key:a,flag:Deletion}〕
  {key:d,flag:Placement}代表d对应DOM需要插入页面。
  {key:a,flag:Deletion}代表a对应DOM需要被删除。
  执行后的结果就是:页面中的a变为d。
  再比如:更新前constbefore〔{key:a},{key:b},{key:c},〕更新后constafter〔{key:c},{key:b},{key:a}〕diff(before,after)输出〔{key:b,flag:Placement},{key:a,flag:Placement}〕
  由于b之前已经存在,{key:b,flag:Placement}代表b对应DOM需要向后移动(对应parentNode。appendChild方法)。abc经过该操作后变为acb。
  由于a之前已经存在,{key:a,flag:Placement}代表a对应DOM需要向后移动。acb经过该操作后变为cba。
  执行后的结果就是:页面中的abc变为cba。
  Diff算法实现
  核心逻辑包括三步:
  遍历前的准备工作遍历after遍历后的收尾工作functiondiff(before:NodeList,after:NodeList):NodeList{constresult:NodeList〔〕;。。。遍历前的准备工作for(leti0;iafter。length;i){。。。核心遍历逻辑}。。。遍历后的收尾工作returnresult;}遍历前的准备工作
  我们将before中每个node保存在以node。key为key,node为value的Map中。
  这样,以O(1)复杂度就能通过key找到before中对应node:
  保存结果constresult:NodeList〔〕;将before保存在map中constbeforeMapnewMapstring,Node();before。forEach((node,i){node。indexi;beforeMap。set(node。key,node);})遍历after
  当遍历after时,如果一个node同时存在于before与after(key相同),我们称这个node可复用。
  比如,对于如下例子,b是可复用的:
  更新前constbefore〔{key:a},{key:b}〕更新后constafter〔{key:b}〕
  对于可复用的node,本次更新一定属于以下两种情况之一:
  不移动移动
  如何判断可复用的node是否移动呢?
  我们用lastPlacedIndex变量保存遍历到的最后一个可复用node在before中的index:
  遍历到的最后一个可复用node在before中的indexletlastPlacedIndex0;
  当遍历after时,每轮遍历到的node,一定是当前遍历到的所有node中最靠右的那个。
  如果这个node是可复用的node,那么nodeBefore与lastPlacedIndex存在两种关系:
  注:nodeBefore代表该可复用的node在before中的对应node
  nodeBefore。indexlastPlacedIndex
  代表更新前该node在lastPlacedIndex对应node左边。
  而更新后该node不在lastPlacedIndex对应node左边(因为他是当前遍历到的所有node中最靠右的那个)。
  这就代表该node向右移动了,需要标记Placement。
  nodeBefore。indexlastPlacedIndex
  该node在原地,不需要移动。
  遍历到的最后一个可复用node在before中的indexletlastPlacedIndex0;for(leti0;iafter。length;i){constafterNodeafter〔i〕;afterNode。indexi;constbeforeNodebeforeMap。get(afterNode。key);if(beforeNode){存在可复用node从map中剔除该可复用nodebeforeMap。delete(beforeNode。key);constoldIndexbeforeNode。indexasnumber;核心判断逻辑if(oldIndexlastPlacedIndex){移动afterNode。flagPlacement;result。push(afterNode);continue;}else{不移动lastPlacedIndexoldIndex;}}else{不存在可复用node,这是一个新节点afterNode。flagPlacement;result。push(afterNode);}遍历后的收尾工作
  经过遍历,如果beforeMap中还剩下node,代表这些node没法复用,需要被标记删除。
  比如如下情况,遍历完after后,beforeMap中还剩下{key:a}:更新前constbefore〔{key:a},{key:b}〕更新后constafter〔{key:b}〕
  这意味着a需要被标记删除。
  所以,最后还需要加入标记删除的逻辑:beforeMap。forEach(node{node。flagDeletion;result。push(node);});

关于信任小学作文400字汇总十篇在我们平凡的日常里,大家一定都接触过书信吧,书信在人类的交流与沟通的历史上占有重要地位。写起信来就毫无头绪?下面是小编精心整理的信任小学作文400字10篇,仅供参考,欢迎大家阅……高中是青春开的花儿700字学生作文看着教室里陌生又夹杂着熟悉的面孔,才把思绪从炎热的夏季拉到这个微凉的秋天。那会儿还在焦头烂额地对付着中考,这会已是高中新生了。黑板上还板着昨夜白花花的讲义,尚来不及擦,夜色轰隆……印度冻结小米48亿资产之后,为什么很多原来不看好小米的人都开(原创)被印度冻结48亿资产,说明小米很有实力,这是我国民族工业的骄傲,印度冻结小米资产之举变相为小米作了很好的广告,支持小米的人能不多起来吗?支持民族品牌,就是爱国!……如果支付宝实行会员制,一个月5元。你还会继续使用吗?上一个这么干的是企鹅!2001年,腾讯搞了个骚操作,注册QQ号收费,一个1块钱。网友怎么看?网友在网上骂翻了天!其他公司怎么看?网易推出泡泡、新浪……学国学诵经典传美德作文唐诗、宋词、神话故事;《论语》、《三字经》、《水浒传》;成语、谚语、歇后语;hellip;hellip;hellip;中国古籍,车载斗量。被人们传承咏唱的国学经典,是中华民族宝……关于风景的作文又是一年月圆时一轮明月,世世代代,都一如既往的挂在夜空中,那种耀眼,那种迷人都散发着一种似曾相识的感觉。吃完了晚饭,窗外已是夜幕降临,透过窗子往外看,只见一轮明月高挂在夜空中,似乎正等……杀意的影子E度网专稿未经允许不得转载那一刻,她的脑子里想了很多东西。奔跑在夜幕中的他,为了帮任性的她买一杯暖彻人心的甜豆浆。奔跑在夕阳中的他,为了给她这个笨蛋烧一顿好吃……初一写人作文小朋友我为你点赞近几年来,碰瓷事件时有发生,导致现在的人们都不敢去扶老人。如果真正摔倒的老人没有人去扶,又会如何?等待他们的又是什么?周六,我出去玩,走到马路上时,看见了前面围了一群人。……暑假生活的作文第一篇、暑假作文在我的暑假生活中,我很忙,在我爸妈的压制下,我不得不完成他们给我布置每天的任务,还要每天为他们做家务,当然,我也可以从中获得一些报酬。有一次,我下午看电视……高一观后感风雨哈佛路观后感10或者我可以推自己一把,让我的生活变好是的,如果走什么力量在支撑着你不断向前的话,那种力量应该来自于对未知世界的探索,那种怀揣着的梦想,对未来的渴望,不管这种力量有多少,那总是你……妈妈的手我有一个好妈妈,一个和蔼可亲的好妈妈!妈妈有一双劳动过度,而长满老茧的双手,看起来显得又苍老又辛苦,但是,我却把那一双手看做是宝贝,因为它给我无限的力量。在一个寒冷的夜晚……朋友给我签个名的作文又是一个美好的一天啊!诺希伸了伸懒腰,外面的花儿开了,五彩缤纷,蝴蝶在花上飞,诺希用细长美丽的手打开窗户,贪婪的吸着这新鲜的空气。待诺希准备吃饭的时候,诺希!诺希!快下来……
工信部副部长辛国斌在北京调研智能制造发展情况e公司讯,1月26日,工信部副部长辛国斌等在北京调研智能制造发展情况,并就高水平推进智能制造实施、高起点谋划装备数字化等进行了讨论。调研组一行先后考察了三一智造桩工机械智能工厂……关于描写春季的作文300字锦集6篇在现实生活或工作学习中,大家都写过作文,肯定对各类作文都很熟悉吧,通过作文可以把我们那些零零散散的思想,聚集在一块。那么你知道一篇好的作文该怎么写吗?以下是小编整理的描写春季的……童话故事卷心菜公主卷心菜满心烦恼地挠了挠头,忽然,她的手触到了一直戴在头上的水晶发卡,那是她从一出生就戴着的发卡。她还记得小时候,每天清晨,娜塔莎妈妈都会在镜前帮她梳起长发,然后再认真地帮她别好……春节前,北京首次判决,出借者与平台无债务关系吗?那借贷者呢?搞网贷只是借用网上平台而己,确实和平台无债务关系,借贷者和平台也无债务关系;借贷者借的是出借者的钱。这就好比你租的房子经商一样。百分百有关系相信大家这些年对于金融网……中国那么多科学家,为什么制造不出来廉价又质量高的助听器?一开始只能追求质量高,有了技术积累和一定市场规模之后才有可能降低成本。然而国内环境恰恰不容易给你积累发展的机会。需要助听器的人可能不少,但是真愿意掏钱的太少。我身边有一些老人听……为什么那么多人用苹果手机?国产手机真的不如苹果手机吗?各方面肯定是不如的。虽然仅看参数,好像安卓机挺厉害。但实际使用起来,苹果的体验更好。也更安全。作为一名双机党,长期使用苹果手机和国产安卓手机,使用久了还是能感……苹果7是真四核还是假四核?想知道苹果7是真四核还是假四核?那首先来看看iphone7的详细参数吧iPhone7搭载了A10Fusion处理器,CPU部分为22结构,总晶体管数目高达33亿,要……手机用几年为什么就会卡?感谢您的阅读!我们手机用几年之后会出现卡顿的情况,到底是什么原因?一款手机出现卡顿是有多个因素导致的,我们在这里和大家分析。第1个因素是手机本身的处理器和手机……公司系统太多了,有啥软件可以去集成这些系统吗?企业在信息化建设过程中,各个业务部门均建立各自的系统,各个业务系统之间不互通,造成企业信息孤岛。随着企业生存环境日益复杂,竞争日趋激烈,业务日益复杂,企业亟需进行数字化转型,对……水厂之旅作文600字星期天上午,我和我们四(8)班的同学去大丰水厂参观。经过ldquo;漫长rdquo;的车程,我们终于到了,一下车我们就去了水厂的大堂,在大堂,我们先初步了解了节水知识,比……冬天过后就是春天冬天过后就是春天,我可是对此深信不疑。Because这句话是我家经历一场家庭危机之后,才知晓的。如果你不相信的话,我可以给你娓娓道来我坐在房间里,翻看着相册,一一抚过那些……冬天景物的作文10篇冬姑娘把她的所有无私地奉献给了人类,而且还守护了自然,她确实是一个杰出的奉献者,是爱心大使,是不朽的诗篇。下面是小编收集的冬天景物的作文,欢迎阅读。冬天景物的作文1冬,是……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网