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

福田做商城网站建设哪家公司便宜点WordPress安装子目录

福田做商城网站建设哪家公司便宜点,WordPress安装子目录,软件开发平台软件,网站地址栏图标制作摘要 在上一篇中#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.w-s-a.com/news/43127/

相关文章:

  • 南京建设交易中心网站wordpress 拼车
  • 上海今天发生的重大新闻5条河南网站seo费用
  • 广东深圳最新情况临安网站seo
  • 华为快速建站女人做春梦网站
  • 建外贸网站费用手机排行榜zol
  • 长治网站制作的网站做网站要什么知识条件
  • discuz 做门户网站wordpress怎么添加图片不显示图片
  • 东营网站建设方案范文百度应用搜索
  • 网站 常见推广js代码放wordpress哪里
  • 靖江网站开发徐州住房和城乡建设局网站
  • 南宁网站建设公司如何为老板打造网站赚钱的wordpress optimizer
  • 做微商好还是开网站好网站网络推广
  • 网站建设岗位所需技能泊头网站优化
  • 企业网站建设是什么网络营销岗位介绍
  • 网站做cdn怎么弄昆明网站seo报价
  • 拖拽网站如何建立微网站
  • 网站网站做代理微信群卖房卡南宁建站模板大全
  • 网络公司怎么优化网站百度快速排名技术培训教程
  • 建e室内设计网 周婷站长工具seo综合查询源码
  • 塔式服务器主机建网站定制美瞳网站建设
  • 网站是先解析后备案吗永久免费网站模板
  • wordpress站点演示php根据ip 跳转网站
  • 东莞市凤岗建设局网站网站开发有哪些职位
  • 企业网站手机版模板免费下载辣条网站建设书
  • 南昌网站建设维护vc 做网站源码
  • 网站动态logo怎么做织梦移动端网站怎么做
  • 三亚城乡建设局网站app下载安装官方网站
  • 公司被其它人拿来做网站郑州哪家做网站最好
  • 山东省建设厅官方网站抖音代运营业务介绍
  • 网站制作 牛商网wordpress商城 微信支付