首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【MySQL基础】MySql如何根据输入id获得树形结构节点列表:使用自连+SUBSTRING_INDEX函数

有如下树形结构:RT-ST-SST-SSST共四层,RT是根节点,往后依次是一代节点,二代节点,三代节点如何根据当前节点id,获得其节点呢?这是一个SQL问题。...加入传入id为1(即根节点),使用自连+SUBSTRING_INDEX函数得到其节点: 示例: id name type url 1 大树 RT root...为1(即根节点),使用自连+SUBSTRING_INDEX函数得到其节点: mysql> select tree1.* from tree_node as tree1 -> join tree_node...url and (length(tree1.url) - length(replace(tree1.url, '/', ''))) = 1 where tree2.id = 1; ##返回"树干1"节点...1,则认为是节点 mysql> select length('root/tree_main_line1') - length(replace('root/tree_main_line1', '/',

1.5K20
您找到你想要的搜索结果了吗?
是的
没有找到

彻底搞懂Vue虚拟Dom和diff算法

oldCh, ch) }else if (ch){ //如果节点节点节点没有节点,那么将节点节点添加到老节点上 createEle...(vnode) }else if (oldCh){ //如果节点没有节点节点节点,那么删除节点节点 api.removeChildren...(el) } }}如果两个节点不一样,直接用节点替换节点;如果两个节点一样,新老节点一样,直接返回;节点节点节点没有:删除节点节点节点没有节点节点节点...:节点节点直接append到老节点;都只有文本节点:直接用节点文本节点替换文本节点;都有节点:updateChildren复杂情况也就是新老节点都有节点,那么updateChildren...index添加到真实DOM;newStartIdx > newEndIdx表示ch先遍历完成,那么就要在真实DOM中将多余节点删除掉;看下图这个实例,就是节点先遍历完成删除多余节点:图片最后,在这些节点

73510

重谈react优势——react技术栈回顾

当根节点发现节点中 A 消失了,就会直接销毁 A;当 D 发现多了一个节点 A,则会创建 A(包括节点)作为其节点。...INSERT_MARKUP, component 类型不在集合里, 即是全新节点,需要对节点执行插入操作。...REMOVE_NODE, component 类型,集合里也有,但对应 element 不同则不能直接复用和更新,需要执行删除操作,或者 component 不在集合里,也需要执行删除操作...如下图,集合包含节点:A、B、C、D,更新集合包含节点:B、A、D、C,此时新老集合进行 diff 差异化对比,发现 B !...= A,则创建并插入 B 至集合,删除集合 A;以此类推,创建并插入 A、D 和 C,删除 B、C 和 D。

1.2K30

「源码剖析」如何实现一个虚拟DOM算法

上篇文章《虚拟DOM如何进化为真实DOM》中讲到了如何通过虚拟DOM树转化为真实DOM渲染到页面。但是渲染过程,我们直接将虚拟DOM树转化成真实DOM替换掉旧DOM结构。...platforms\web\runtime\modules\attrs.js 2、样式处理 如果样式存在样式没有那么删除样式。...src\platforms\web\runtime\modules\class.js 比较儿子 比较儿子过程可以分为以下几种情况: 1、节点有儿子,节点没有儿子删除节点儿子即可 if (...vue2.0比较节点节点区别的时候采用了双指针方式,通过同时向同一个方向循环节点节点,只要有一个节点循环完成就结束循环。...使用index作为key时候还会产生意想不到问题,假如我们把B节点删除,我们开始取值为B,现在取值变成了C。

58520

理论 | React 源码剖析系列 - 不可思议 react diff

REMOVE_NODE, component 类型,集合里也有,但对应 element 不同则不能直接复用和更新,需要执行删除操作,或者 component 不在集合里,也需要执行删除操作...如下图,集合包含节点:A、B、C、D,更新集合包含节点:B、A、D、C,此时新老集合进行 diff 差异化对比,发现 B !...新老集合所包含节点,如下图所示,新老集合进行 diff 差异化对比,通过 key 发现新老集合节点都是相同节点,因此无需进行节点删除和创建,只需要将集合节点位置进行移动,更新为集合节点位置...以上主要分析新老集合存在相同节点但位置不同时,对节点进行位置移动情况,如果集合中有加入节点集合存在需要删除节点,那么 React diff 又是如何对比运作呢?...当完成集合中所有节点 diff 时,最后还需要对集合进行循环遍历,判断是否存在集合没有但集合仍存在节点,发现存在这样节点 D,因此删除节点 D,到此 diff 全部完成。

25320

带你彻底读懂React VDOM DIFF

,reconcileChildFibers做事情就是判断节点newChild类型,再决定如何协调。...{ // 本函数要做事情就是diff新老vdom,尽可能多复用vdom情况下生成vdom,即fiber结构,并返回第一个fiber, // 这个fiber...step4: 走到现在,新老节点都还有,麻烦地方来了,也是React Diff核心 // 经过上面的步骤,走到这里新老vdom都是乱序,因此接下来遍历vdom时候,需要考虑事情是如何...如果经过step1,节点已经遍历完了,那么如果还有剩下节点删除即可。 3. 如果经过step1,节点没了,节点还有,那么节点逐个新增即可。初次渲染走就是这里。 4....首先,根本上在于数据结构不同,因为Vue多个节点时候,老子节点就是数组,而React则是单链表。

70520

【Vue原理】Diff - 源码版 之 Diff 流程

,那么没得比较了,所有节点都是全新 所以直接全部新建就好了,新建是指创建出所有DOM,并且添加进父节点 2 只有旧节点 只有旧节点而没有节点,说明更新页面,旧节点全部都不见了 那么要做,就是把所有的旧节点删除...处理节点 和 旧节点,循环遍历逐个比较 如何 循环遍历?...1、比较新旧节点 2、比较完毕,处理剩下节点 我们来逐个说明这两个流程 1 比较新旧节点 注:这里有两个数组,一个是 Vnode数组,一个旧Vnode数组 比较过程,不会对两个数组进行改变...找到 新旧节点 相同节点,尽量以 移动 替代 新建 去更新DOM 只有实在不同情况下,才会新建 比较更新计划步骤 首先考虑,不移动DOM 其次考虑,移动DOM 最后考虑,新建 / 删除...newEndIdx ,结束循环 5 批量删除可能剩下节点 此时看 旧 Vnode 数组, oldStartIdx 和 oldEndIdx 都指向同一个节点,所以只用删除 oldVnode-4 这个节点

1.3K50

详解 React 16 Diff 策略

,然后再去找当前节点兄弟节点,直到找到 key 相同,并且节点类型相同,否则就删除所有的节点。...这已经是一个非常简单例子了,div child 是一个数组,有 AAA、BBB 然后还有其他兄弟节点,在做 diff 时候就可以从新旧数组按照索引一一对比,如果可以复用,就把这个节点链表里面删除...节点已经遍历完毕 如果节点已经遍历完毕的话,也就是没有要更新了,这种情况一般就是从原来数组里面删除了元素,那么直接把剩下节点删除了就行了。还是拿上面的图例子举例,链表里???...还有很多节点,而链表???已经没有节点了,所以链表???不管是有多少节点,都不能复用了,所以没用了,直接删除。...第一遍历完之后,删除剩余节点,追加剩余节点过程。如果是节点已遍历完成,就将剩余节点批量删除;如果是节点遍历完成仍有节点剩余,则将节点直接插入。

2K40

手写ReactFiber架构,深入理解其原理

操作,需要删除不需要节点,更新修改过节点,添加节点。...这个函数里面不能简单创建节点了,而是要将节点节点拿来对比,对比逻辑如下: 如果新老节点类型一样,复用节点DOM,更新props 如果类型不一样,而且节点存在,创建节点替换节点 如果类型不一样...,没有节点,有节点删除节点 注意删除节点操作是直接将oldFiber加上一个删除标记就行,同时用一个全局变量deletions记录所有需要删除节点: // 对比oldFiber...sameType && oldFiber) { // 如果类型不一样,没有节点,有节点删除节点 oldFiber.effectTag = 'DELETION';...虚拟DOM调和和渲染可以简单粗暴递归,但是这个过程是同步,如果需要处理节点过多,可能会阻塞用户输入和动画播放,造成卡顿。 Fiber是16.x引入特性,用处是将同步调和变成异步

1.6K31

详解 React 16 Diff 策略

,然后再去找当前节点兄弟节点,直到找到 key 相同,并且节点类型相同,否则就删除所有的节点。...这已经是一个非常简单例子了,div child 是一个数组,有 AAA、BBB 然后还有其他兄弟节点,在做 diff 时候就可以从新旧数组按照索引一一对比,如果可以复用,就把这个节点链表里面删除...节点已经遍历完毕 如果节点已经遍历完毕的话,也就是没有要更新了,这种情况一般就是从原来数组里面删除了元素,那么直接把剩下节点删除了就行了。还是拿上面的图例子举例,链表里???...还有很多节点,而链表???已经没有节点了,所以链表???不管是有多少节点,都不能复用了,所以没用了,直接删除。...第一遍历完之后,删除剩余节点,追加剩余节点过程。如果是节点已遍历完成,就将剩余节点批量删除;如果是节点遍历完成仍有节点剩余,则将节点直接插入。

56320

详解 React 16 Diff 策略

,然后再去找当前节点兄弟节点,直到找到 key 相同,并且节点类型相同,否则就删除所有的节点。...这已经是一个非常简单例子了,div child 是一个数组,有 AAA、BBB 然后还有其他兄弟节点,在做 diff 时候就可以从新旧数组按照索引一一对比,如果可以复用,就把这个节点链表里面删除...节点已经遍历完毕 如果节点已经遍历完毕的话,也就是没有要更新了,这种情况一般就是从原来数组里面删除了元素,那么直接把剩下节点删除了就行了。还是拿上面的图例子举例,链表里???...还有很多节点,而链表???已经没有节点了,所以链表???不管是有多少节点,都不能复用了,所以没用了,直接删除。...第一遍历完之后,删除剩余节点,追加剩余节点过程。如果是节点已遍历完成,就将剩余节点批量删除;如果是节点遍历完成仍有节点剩余,则将节点直接插入。

82410

理解DOM Diff算法

操作 DOM 需要经过跨流程通信和渲染线程触发重新渲染(重绘或者重排),开发,应尽量减少操作 DOM。而虚拟 DOM 出现,更新 DOM 交给框架处理。...或 null,并且虚拟节点有值 // 说明我们删除节点,就调用 Destroy 生命周期钩子 if (isDef(oldVnode)) invokeDestroyHook...)) nodeOps.setTextContent(elm, ''); // 如果儿子有,儿子节点没有 // 会把新增节点插入到老 DOM...,oldCh 是节点;newCh 是节点 let oldStartIdx = 0; // oldVnode 节点初始索引 let newStartIdx = 0...oldKeyToIdx[newStartVnode.key] // 通过 key 可以拿到老元素索引 // 如果开始元素没有 key,就遍历节点,找到对应

1K10

小白diff算法试试水之旅0.前言1. 主角1:Element构造函数2. 主角2:render函数3. 大主角: diff函数4. 更新5. 完成

patches来变成节点,最终结果基本雏形: let el = render(vnode)//虚拟dom树生成html节点 document.body.appendChild(el) //挂载...//将当前差异数组写入差异表 currentPatch.length && (patches[index] = currentPatch) } 复制代码 对比属性: 我们传入节点节点属性集合...//如果属性不同,写入patch,属性有,属性没有或者不同,写入差异表 oldProp[k] !...== newProp[k] && (patch[k] = newProp[k]) } //节点属性 for(let k in newProp){ //判断节点属性节点里面是否存在,...== newProp[k] && (patch[k] = newProp[k]) } //节点属性 for(let k in newProp){ //判断节点属性节点里面是否存在,

42220

【Vuejs】1146- 这些 Vue 技巧你都掌握了吗?

Diff 原理 核心源码:vue/src/core/vdom/patch.js 搬运对比新老节点 patch 函数入口 /** * 节点不存在,节点存在,调用 destroy,销毁节点 * 如果.../** * 更新节点 * 如果新老节点都有孩子,则递归执行 updateChildren * 如果节点有孩子,节点没孩子,则新增节点这些孩子节点 * 如果节点有孩子,节点没孩子,则删除节点这些孩子...< oldEndIdx) {} // 节点先遍历结束,将剩余节点删掉 } } 复制代码 Vue key 作用 key 是 Vue vnode 唯一标记,我们 diff 算法...sameVnode 用来判断是否为同一节点。常见业务场景是一个列表,若 key 值是列表索引,新增或删除情况下会存在就地复用问题。...updateChildren 当其中四种假设都未匹配,就需要依赖节点 key 和 索引创建关系映射表,再用节点 key 去关系映射表去寻找索引进行更新,这保证 diff 算法更加快速。

1.6K20

带你实现react源码核心功能

基本元素 receiveComponent基础元素更新包括两方面属性更新,包括对特殊属性比如事件处理节点更新节点更新比较复杂,是提升效率关键,所以需要处理以下问题:diff - 拿节点树跟以前节点树对比...我们需要把它对应element删除。..._mountIndex = nextIndex; nextIndex++; } // 对于节点里有,节点里没有的那些,也全都删除掉 for (name in prevChildren...我们假设上一个元素是 A,添加更新了 lastIndex。如果我们这时候来个新元素 B,比 lastIndex 还大说明当前元素集合里面就比上一个 A 靠后。...,这里还会使用 lastIndex 这种做一种优化,使一些节点保留位置,之后根据差异对象操作 dom 元素(位置变动,删除,end这只是个玩具,但实现了 React 核心功能,虚拟节点,差异算法,单向数据更新都在这里了

1.1K40

实现react源码核心功能

基本元素 receiveComponent基础元素更新包括两方面属性更新,包括对特殊属性比如事件处理节点更新节点更新比较复杂,是提升效率关键,所以需要处理以下问题:diff - 拿节点树跟以前节点树对比...我们需要把它对应element删除。..._mountIndex = nextIndex; nextIndex++; } // 对于节点里有,节点里没有的那些,也全都删除掉 for (name in prevChildren...我们假设上一个元素是 A,添加更新了 lastIndex。如果我们这时候来个新元素 B,比 lastIndex 还大说明当前元素集合里面就比上一个 A 靠后。...,这里还会使用 lastIndex 这种做一种优化,使一些节点保留位置,之后根据差异对象操作 dom 元素(位置变动,删除,end这只是个玩具,但实现了 React 核心功能,虚拟节点,差异算法,单向数据更新都在这里了

1.1K100

带你实现react源码核心功能

基本元素 receiveComponent基础元素更新包括两方面属性更新,包括对特殊属性比如事件处理节点更新节点更新比较复杂,是提升效率关键,所以需要处理以下问题:diff - 拿节点树跟以前节点树对比...我们需要把它对应element删除。..._mountIndex = nextIndex; nextIndex++; } // 对于节点里有,节点里没有的那些,也全都删除掉 for (name in prevChildren...我们假设上一个元素是 A,添加更新了 lastIndex。如果我们这时候来个新元素 B,比 lastIndex 还大说明当前元素集合里面就比上一个 A 靠后。...,这里还会使用 lastIndex 这种做一种优化,使一些节点保留位置,之后根据差异对象操作 dom 元素(位置变动,删除,end这只是个玩具,但实现了 React 核心功能,虚拟节点,差异算法,单向数据更新都在这里了

1.2K30
领券