当前位置: 首页 > news >正文

网站排名优化平台网站建设个人网银

网站排名优化平台,网站建设个人网银,苏州网站建设开发,网站背景大小摘要 在上一篇中#xff0c;实现了多节点的渲染。但是之前写得diff算法#xff0c;只能适用于单节点的情况#xff0c;例如这种情况#xff1a; divpspan/span/p /div如果对于多节点的情况#xff1a; ul…摘要 在上一篇中实现了多节点的渲染。但是之前写得diff算法只能适用于单节点的情况例如这种情况 divpspan/span/p /div如果对于多节点的情况 ulli/lili/lili/li /ul之前实现的diff算法就不会有效果了所以在这一篇中我们主要实现针对于多节点的diff算法。 实现之前我们先将index.js修改一下 function App() {const [num, setNum] useState(100)const click1 () {console.log(num);setNum(num 1)}return num % 2 0 ? jsx(ul, {onClick: click1,key: ul,children: [jsx(li, {children: 1,key: 1}), jsx(li, {children: 2,key: 2}), jsx(li, {children: 3,key: 3})]}): jsx(ul, {onClick: click1,key: ul,children: [jsx(li, {children: 2,key: 2}), jsx(li, {children: 1,key: 1}), jsx(li, {children: 3,key: 3})]}); }ReactDOM.createRoot(root).render(App /)1.修改beginWork流程 在reconcileChildren方法里面我们判断了如果element为数组的情况就是多节点。所以我们需要在这里进行diff算法的处理。 function reconcileChildren(parent,element) {//其他代码。。。。}else if(Array.isArray(element) element.length 0) {const newChild diffReconcileManyChildren(parent, element);if(newChild) {return newChild}//其他代码。。。。所以我们的diff算法那主要是在diffReconcileManyChildren方法里面实现。 对于多节点的Diff我们需要进行以下步骤。 创建变量lastIndex用来标记索引将旧的filberNode列表转换为map结构key为filberNode的keyvalue为filberNode遍历新的element数组。如果element.key可以在map中找到lastIndex记录为找到的filberNode的index如果找不到创建新的FilberNode继续遍历如果又在map中找到filberNode比较fiberNode的index和lastIndex.如果index lastIndex给filberNode打上移动的标志 基于上面的步骤实现diffReconcileManyChildren方法 function diffReconcileManyChildren(filberNode, element) {let firstChild filberNode.child;if(!firstChild) {return;}const head {sibling: null};const oldChildren []while(firstChild) {oldChildren.push(firstChild);firstChild firstChild.sibling;}const oldMap new Map();oldChildren.forEach((item,index) {item.index indexif(item.key) {oldMap.set(item.key, item)}else{oldMap.set(index, item)}})let lastIndex 0;let empty headfor(let i0; ielement.length; i) {if(!element[i].key){continue;}const useFilber oldMap.get(element[i].key);useFilber.sibling null;if(useFilber) {if(useFilber.index lastIndex) {useFilber.flags insert}useFilber.memoizedProps element[i]lastIndex useFilber.index;empty.sibling useFilber;empty empty.sibling;oldMap.delete(element[i].key)}else{const filberNode new FilberNode(HostComponent, element[i].props, element[i].key) filberNode.type element[i].typeempty.sibling filberNode;empty empty.sibling;}}return head.sibling; }经过上面的处理beginWork流程结束可复用的filberNode就不会重复创建。 2.修改completeWork流程 在beginWork中可复用的节点已经被打上了insert的标志所以在updateCompleteHsotComponent中我们要判断是不是insert的标志如果是就不能无脑创建而是通过移动DOM的位置来复用DOM。 同时也要对同级的sibling进行递归处理。 function updateCompleteHostComponent(filberNode) {//其他代码。。。。if(element.key filberNode.key element.type filberNode.type) {addPropsToDOM(filberNode.stateNode, filberNode.pendingProps);if(filberNode.flags insert) {const parent filberNode.return;parent.stateNode.insertBefore(filberNode.stateNode, filberNode.sibling?.stateNode)}//其他代码if(filberNode.sibling) {completeWork(filberNode.sibling)} }在对HostText的处理中也要考虑当前的操作是更新还是替换。 function completeHostText(filberNode) {//其他代码。。。。。if(parent parent.stateNode parent.tag HostComponent) {if(!parent.stateNode) {parent.stateNode.appendChild(element);}else{parent.stateNode.replaceChildren(element);}}//其他代码。。。。 }
http://www.yingshimen.cn/news/85633/

相关文章:

  • 网站找人做的他能登管理员吗建筑行业公司
  • 电子商城网站制作上海连锁设计公司
  • 网站在线考试答题系统怎么做淘宝客网站备案流程
  • 莱芜网站建设排行企业网站数防泄露怎么做
  • 四川省城乡住房建设厅网站国家建设管理信息网站
  • 响应式网站 开发网站开发语言是什么意思
  • 网站流量太大杭州市网站制作
  • 五莲网站建设维护推广中国移动积分商城官网
  • 浙江住房和城乡建设厅报名网站舟山做网站
  • 公司宣传网站制作男女这样做那个网站
  • 深圳市宝安区建设局网站怎么建设大淘客网站
  • 湖北企业商城网站建设询价报价单模板
  • 郑州网站建设选微锐xoneindex wordpress
  • 霍山有没有做建网站的国外html5做网站
  • 网站设置gif禁用网站建设文字2000字
  • 怎么让网站让百度收录html网站的规划与建设
  • 北京做微信网站哪家好四川建筑安全员c证报名官网
  • 设计工作室网站首页网站关键词调整 收录
  • 开店装修话做那个网站找工人哈尔滨网站建设 哈尔滨网站推广
  • 国外做网站的公司做网站运营需要做哪些
  • 互联网门户网站模板wordpress 没有数据库
  • 辽宁建设厅查询网站都昌县建设局网站
  • 北京最好的网站制作公司南宁网站排名外包
  • 泗阳做网站阿里云自助建站和华为云自助建站
  • 青岛seo网站关键词优化门户网站建设总结
  • 广西新站seowordpress获取登录密码
  • 没有做网站地图影响大吗吗搜索引擎网络推广方法
  • 网站设置了自动登录怎么显示密码快速建站系统
  • 排版设计的网站wordpress 导航网站主题
  • 河北省电力建设第一工程公司网站wordpress视频弹窗