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

浙江网站建设品牌网站建设 信科网络

浙江网站建设品牌,网站建设 信科网络,郑州上市企业网站建设,邯郸有什么互联网大公司吗文章目录 1. 为什么需要Diff算法#xff1f;2. Diff算法核心原则3. 核心流程图解4. 核心代码实现#xff08;简化版#xff09;5. Key的重要性示例6. 算法优化策略7. 时间复杂度优化8. 与其他框架的对比9. 总结 1. 为什么需要Diff算法#xff1f; 在Vue的响应式系统中2. Diff算法核心原则3. 核心流程图解4. 核心代码实现简化版5. Key的重要性示例6. 算法优化策略7. 时间复杂度优化8. 与其他框架的对比9. 总结 1. 为什么需要Diff算法 在Vue的响应式系统中当数据变化时组件需要重新渲染。直接操作真实DOM非常消耗性能因此Vue使用虚拟DOMVirtual DOM作为中间层。Diff算法的核心作用就是通过对比新旧虚拟DOM树找出最小变更并批量更新真实DOM。 2. Diff算法核心原则 同层比较只比较同一层次的节点不跨层级双端对比同时从新旧子节点的首尾向中间扫描就地复用通过key标识尽可能复用相同节点 3. 核心流程图解 #mermaid-svg-0JNgnCiliLf1klFD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0JNgnCiliLf1klFD .error-icon{fill:#552222;}#mermaid-svg-0JNgnCiliLf1klFD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0JNgnCiliLf1klFD .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-0JNgnCiliLf1klFD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0JNgnCiliLf1klFD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0JNgnCiliLf1klFD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0JNgnCiliLf1klFD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0JNgnCiliLf1klFD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0JNgnCiliLf1klFD .marker.cross{stroke:#333333;}#mermaid-svg-0JNgnCiliLf1klFD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0JNgnCiliLf1klFD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0JNgnCiliLf1klFD .cluster-label text{fill:#333;}#mermaid-svg-0JNgnCiliLf1klFD .cluster-label span{color:#333;}#mermaid-svg-0JNgnCiliLf1klFD .label text,#mermaid-svg-0JNgnCiliLf1klFD span{fill:#333;color:#333;}#mermaid-svg-0JNgnCiliLf1klFD .node rect,#mermaid-svg-0JNgnCiliLf1klFD .node circle,#mermaid-svg-0JNgnCiliLf1klFD .node ellipse,#mermaid-svg-0JNgnCiliLf1klFD .node polygon,#mermaid-svg-0JNgnCiliLf1klFD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0JNgnCiliLf1klFD .node .label{text-align:center;}#mermaid-svg-0JNgnCiliLf1klFD .node.clickable{cursor:pointer;}#mermaid-svg-0JNgnCiliLf1klFD .arrowheadPath{fill:#333333;}#mermaid-svg-0JNgnCiliLf1klFD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0JNgnCiliLf1klFD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0JNgnCiliLf1klFD .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-0JNgnCiliLf1klFD .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-0JNgnCiliLf1klFD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0JNgnCiliLf1klFD .cluster text{fill:#333;}#mermaid-svg-0JNgnCiliLf1klFD .cluster span{color:#333;}#mermaid-svg-0JNgnCiliLf1klFD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0JNgnCiliLf1klFD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 相同 不同 相同 不同 相同 不同 相同 不同 是 否 开始对比 旧开始 vs 新开始? 更新节点并右移指针 旧结束 vs 新结束? 更新节点并左移指针 旧开始 vs 新结束? 移动节点到末尾 旧结束 vs 新开始? 移动节点到开头 查找Key索引 存在相同Key? 复用节点并移动 创建新节点 4. 核心代码实现简化版 function updateChildren(parentElm, oldCh, newCh) {let oldStartIdx 0let oldEndIdx oldCh.length - 1let newStartIdx 0let newEndIdx newCh.length - 1while (oldStartIdx oldEndIdx newStartIdx newEndIdx) {// 四种对比情况if (sameVnode(oldCh[oldStartIdx], newCh[newStartIdx])) {patchVnode(oldCh[oldStartIdx], newCh[newStartIdx])oldStartIdxnewStartIdx} else if (sameVnode(oldCh[oldEndIdx], newCh[newEndIdx])) {patchVnode(oldCh[oldEndIdx], newCh[newEndIdx])oldEndIdx--newEndIdx--}else if (sameVnode(oldCh[oldStartIdx], newCh[newEndIdx])) {// 移动节点到旧结束节点之后parentElm.insertBefore(oldCh[oldStartIdx].elm, oldCh[oldEndIdx].elm.nextSibling)patchVnode(oldCh[oldStartIdx], newCh[newEndIdx])oldStartIdxnewEndIdx--}else if (sameVnode(oldCh[oldEndIdx], newCh[newStartIdx])) {// 移动节点到旧开始节点之前parentElm.insertBefore(oldCh[oldEndIdx].elm, oldCh[oldStartIdx].elm)patchVnode(oldCh[oldEndIdx], newCh[newStartIdx])oldEndIdx--newStartIdx}else {// Key查找逻辑const keyMap createKeyMap(newCh, newStartIdx, newEndIdx)const idxInOld findIdxInOld(oldCh, newStartVnode, keyMap)if (idxInOld) {// 移动已有节点parentElm.insertBefore(oldCh[idxInOld].elm, oldStartVnode.elm)patchVnode(oldCh[idxInOld], newCh[newStartIdx])oldCh[idxInOld] undefined} else {// 创建新节点parentElm.insertBefore(createElm(newCh[newStartIdx]), oldStartVnode.elm)}newStartIdx}}// 处理剩余节点if (oldStartIdx oldEndIdx) {addNewNodes(parentElm, newCh, newStartIdx, newEndIdx)} else {removeOldNodes(parentElm, oldCh, oldStartIdx, oldEndIdx)} }5. Key的重要性示例 !-- 没有key的情况 -- ulli v-foritem in list{{ item }}/li /ul!-- 有key的情况 -- ulli v-foritem in list :keyitem.id{{ item.text }}/li /ul无Key时的Diff行为 默认使用就地复用策略如果列表顺序改变会导致大量不必要的DOM操作可能引发状态错乱如表单元素 有Key时的优势 精确识别节点身份最大化复用相同节点避免不必要的DOM操作 6. 算法优化策略 首尾指针快速匹配处理常见的前后添加/删除Key映射表O(1)复杂度查找可复用节点批量DOM操作最后统一处理剩余节点的添加/删除节点类型判断不同类型节点直接替换 7. 时间复杂度优化 通过以下策略将O(n³)复杂度优化到O(n) 只比较同层级节点使用key建立索引首尾四指针快速跳过相同前缀/后缀 8. 与其他框架的对比 特性VueReact对比策略双端对比单端递归Key作用域同一层级内唯一全局唯一移动节点处理直接移动DOM标记后统一处理静态节点优化编译时标记不可变数据结构 9. 总结 Vue的Diff算法通过以下方式实现高效更新 优先处理常见的前后操作利用key实现精确节点匹配最小化DOM操作次数智能处理节点复用和移动 理解Diff算法的工作原理有助于 编写更高效的模板代码合理使用key优化列表渲染避免不必要的组件重新渲染深入理解Vue的响应式更新机制 流程图说明补充 四个指针分别指向新旧子节点的首尾优先处理四种可能的匹配情况 旧头 vs 新头旧尾 vs 新尾旧头 vs 新尾旧尾 vs 新头 当四种情况都不匹配时使用key映射表查找最后处理剩余的新增/删除节点 通过这种设计Vue能够在大多数常见操作如列表项的顺序调整中达到O(n)的时间复杂度保证高效的视图更新。
http://www.hkea.cn/news/14526056/

相关文章:

  • 怎么注册网站的步骤wordpress优化检测
  • 怎样自己搭建一个做影视的网站心理咨询类微网站怎么做
  • 做网站有什么作用德国室内设计联盟
  • 网站推广免费济南建设工程交易网
  • 3小说网站开发wordpress 自动安装 插件怎么用
  • 有什么做旅游攻略的网站好更改wordpress默认登录后台
  • 电子商务网站建设题库及答案建设一个企业网站要多少钱
  • 做网站前期需求分析收费么品牌开发者应考虑的因素
  • 广州有建网站的公司吗工业设计产品效果图
  • 做网站上市的公司网站制作网站做网
  • 珠海市官网网站建设价格北京网站上排名
  • 黑龙江住房和城乡建设部网站无经验能做sem专员
  • 网站制作网页淄博机关建设网站
  • 开发网站用什么语言最好吗做网站投广告攻略
  • 医院行业网站建设资格执业注册中心网站
  • 微信免费做邀请函模版网站设计师用什么软件设计效果图
  • 湖北seo网站设计万维网注册域名后怎么导入网站
  • 怎样用织梦做网站雅茂道网站建设
  • 怎么做一种网站为别人宣传论文网站建设方案
  • 企业网站建设流程介绍淄博网络运营公司
  • 小米盒子做网站美术网站建设方案
  • dede视频网站模板备案 网站负责人 法人
  • 给人做网站网站犯法嘛永久域名注册多少钱
  • 苏州营销型网站开发公司wordpress发布文章提示失败
  • 专业网站建设是哪家便宜wordpress实现圈子功能
  • 吉林省住房城乡建设厅网站苏州市建设局网站首页
  • 镇江网站关键字优化机构吐鲁番建设局网站
  • 公总号开发就是网站开发吗返利的网站怎么做
  • 江苏省网站备案查询网站开发 0755
  • 门户网站建设中标结果WordPress导航类主题主题