经过几次失败的React入门尝试之后,我终于开始了解它了,我开始明白为什么我可能想使用React而不是原始的JS或jQuery。...继续并删除/src目录中的所有文件,我们将创建自己的样板文件,而不至于臃肿。我们只保留index.css和index.js。.../index.css' 让我们再次创建我们的App组件。以前,我们只有一个,但是现在我还要添加一个带有类的div元素。你会注意到,我们使用的是className而不是class。...这是我们的第一个提示,此处编写的代码是JavaScript,而不是HTML。...state状态 现在,我们将字符数据存在变量的数组中,并将其作为props传递。这是一个很好的开始,但是请想象下,如果我们希望能够从数组中删除一个项目。
这种策略就是从 div 下面的所有子节点去找有没有可以复用的节点,而不是像 TextNode 一样,只是找第一个 child 是否可以复用,如果当前节点的 key 不同,就代表肯定不是同一个节点,所以把当前节点删除...把所有老数组元素按 key 或者是 index 放 Map 里,然后遍历新数组,根据新数组的 key 或者 index 快速找到老数组里面是否有可复用的。...元素有 key 就 Map 的键就存 key,没有 key 就存 index,key 一定是字符串,index 一定是 number,所以取的时候是能区分的,所以这里用的是 Map,而不是对象,如果是对象...(123 → 4321 插入4,移动2 1): 最后删除没有涉及的元素。...把所有老数组元素按 key 或 index 放 Map 里,然后遍历新数组,插入老数组的元素,这是移动的情况。
例如,可以通过 CSS 隐藏或显示节点,而不是真正地移除或添加 DOM 节点 (2)component diff: component diff是专门针对更新前后的同一层级间的React组件比较的diff...具体更新过程我们拿key=0的元素来说明, 数组重新排序后: 组件重新render得到新的虚拟dom; 新老两个虚拟dom进行diff,新老版的都有key=0的组件,react认为同一个组件,则只可能更新组件...在开发过程中,尽量减少类似将最后一个节点移动到列表首部的操作。当节点数量过大或更新操作过于频繁时,这在一定程度上会影响 React 的渲染性能。。...(5)key使用注意事项: 如果遍历的列表子节是作为纯展示,而不涉及到列表元素顺序的动态变更,那使用index作为key还是没有问题的。...key只是针对同一层级的节点进行了diff比较优化,而跨层级的节点互相之间的key值没有影响 大部分情况下,通过遍历的同一层级的使用了key属性的元素节点其节点类型是相同的(比如都是span元素或者同一个组件
这时框架中的数据和 DOM 之间的关系会变得混乱。实际上,从组件中删除 DOM 可能会导致以下错误: ? React中的DOM错误 因为框架正在寻找已被删除的 DOM。...然后,通过同步 DOM 中的框架数据,DOM 中的 元素 6 移动到元素 3 前面。 ? 最后,同步最后的 DOM,原生组件中的数据 6 也移动到数据 3 的前面。 ?...因此,你可以创建类似的方法并使结果相同,而不是以相同的方式创建它。 ListDiffer ListDiffer 是一个比较库,用于检测列表(或数组)中的更改并跟踪更改的进度。 ?...通过 remove 方法从索引中删除数据。 ordered 是要移动的数组起始索引和结束索引。...许多人在使用 egjs,而且正在用到许多框架中,如React、Angular 和 Vue。以前它需要花费两倍的时间来进行处理,因为它是用两组代码进行管理的。
这种策略就是从 div 下面的所有子节点去找有没有可以复用的节点,而不是像 TextNode 一样,只是找第一个 child 是否可以复用,如果当前节点的 key 不同,就代表肯定不是同一个节点,所以把当前节点删除...把所有老数组元素按 key 或者是 index 放 Map 里,然后遍历新数组,根据新数组的 key 或者 index 快速找到老数组里面是否有可复用的。...元素有 key 就 Map 的键就存 key,没有 key 就存 index,key 一定是字符串,index 一定是 number,所以取的时候是能区分的,所以这里用的是 Map,而不是对象,如果是对象...移动的情况,即之前就存在这个元素,后续只是顺序改变(123 → 4321 插入4,移动2 1): ? 最后删除没有涉及的元素。...把所有老数组元素按 key 或 index 放 Map 里,然后遍历新数组,插入老数组的元素,这是移动的情况。
而如果是函数组件或class组件,其type就是对应的class或function对象图片 图片2.diff算法React需要同时维护两棵虚拟DOM树:一棵表示当前的DOM结构,另一棵在React状态变更将要重新渲染时生成...例如,可以通过 CSS 隐藏或显示节点,而不是真正地移除或添加 DOM 节点(2)component diff:component diff是专门针对更新前后的同一层级间的React组件比较的diff...具体更新过程我们拿key=0的元素来说明, 数组重新排序后:组件重新render得到新的虚拟dom;新老两个虚拟dom进行diff,新老版的都有key=0的组件,react认为同一个组件,则只可能更新组件...(5)key使用注意事项:如果遍历的列表子节是作为纯展示,而不涉及到列表元素顺序的动态变更,那使用index作为key还是没有问题的。...key只是针对同一层级的节点进行了diff比较优化,而跨层级的节点互相之间的key值没有影响大部分情况下,通过遍历的同一层级的使用了key属性的元素节点其节点类型是相同的(比如都是span元素或者同一个组件
而如果是函数组件或class组件,其type就是对应的class或function对象 图片 图片 2.diff算法 React需要同时维护两棵虚拟DOM树:一棵表示当前的DOM结构,另一棵在React...例如,可以通过 CSS 隐藏或显示节点,而不是真正地移除或添加 DOM 节点 (2)component diff: component diff是专门针对更新前后的同一层级间的React组件比较的diff...具体更新过程我们拿key=0的元素来说明, 数组重新排序后: 组件重新render得到新的虚拟dom; 新老两个虚拟dom进行diff,新老版的都有key=0的组件,react认为同一个组件,则只可能更新组件...在开发过程中,尽量减少类似将最后一个节点移动到列表首部的操作。当节点数量过大或更新操作过于频繁时,这在一定程度上会影响 React 的渲染性能。。...key只是针对同一层级的节点进行了diff比较优化,而跨层级的节点互相之间的key值没有影响 大部分情况下,通过遍历的同一层级的使用了key属性的元素节点其节点类型是相同的(比如都是span元素或者同一个组件
html元素渲染即可 但是现在问题来了,我们这是一个现成的react页面,是一个详情页,页面的内容是多个接口返回填进去的: 标题1 {接口1返回} react下进行原生js操作是很危险的,重新渲染,删除元素的时候分分钟页面白屏——a不是b的子节点。...这个操作过程,夹杂react+原生js,当遇到各种复杂的state、props变化,整个组件重新渲染,新的innerhtml,删除createPortal产生的节点的瞬间,因为它真实的父节点也不在了,最后就报错...react元素 // 现在全部换成原生js字符串拼接 + 原生的dom操作 aside.innerHTML = ` xxxxx ...原本设计是一个组件,实际上应该做成一个hook的,改起来也很简单,就不说了 最后 这个小功能使用只是一瞬间,但实现过程很复杂,涉及到的知识点比较多 react下使用原生js,避免直接和state、props
数组中的每个值都有一个索引,每个索引在内存地址中都有一个引用。每个值都可以通过使用它们的索引来访问。数组的索引从零开始,最后一个元素的索引从数组的长度减一。...拼接:需要三个参数:起始位置、删除次数和添加项数。...pop:最后删除项目。...shift:删除数组开头的一个数组元素。...我们不能将箭头函数用作对象方法,因为这个词指的是箭头函数内的 Window 而不是对象本身。
,当然这不是React中用以描述节点的对象,React中创建一个React元素的相关源码在react/src/ReactElement.js中,文中的React版本是16.10.2。...通俗点说就是: 只进行统一层级的比较,如果跨层级的移动则视为创建和删除操作。 如果是不同类型的元素,则认为是创建了新的元素,而不会递归比较他们的孩子。...Fiber来进行diff,期间是可中断的,因为每次执行下一个Fiber的比对时,都会先判断这一帧剩余的时间是否充足,链表的每一个节点是Fiber,而不是在16之前的虚拟DOM节点,每一个Fiber都有React16...,即如果老的数组和新的数组里面都有这个元素,而且位置不相同这种情况下的复用,React把所有老数组元素按key或者是index放Map里,然后遍历新数组,根据新数组的key或者index快速找到老数组里面是否有可复用的...把所有老数组元素按key或index放Map里,然后遍历新数组,插入老数组的元素,这是移动的情况。
pop() – 移除数组末尾的最后一个元素。 shift() – 移除数组头部的第一个元素。 slice() – 创建数组的浅拷贝副本。 Array.isArray() – 判断某个值是不是数组。...可以传入一个自定义分隔符用于拼接数组元素。...,最后一个元素变成第一个、第一个元素变成最后一个。...使用 splice() 方法向数组中添加一个元素,需要传入插入的目标位置、从目标位置算起想要删除的元素数量以及要插入的元素。...下面的例子中,我们在索引为 1 的位置上插入了一个元素 zack,没有删除任何元素。
React 元素的事件处理和 DOM 元素的很相似,但是有一点语法上的不同 React 事件的命名采用小驼峰式(camelCase),而不是纯小写 使用 JSX 语法时你需要传入一个函数作为事件处理函数...,而不是一个字符串 一、事件处理 1.事件绑定 React 元素的事件处理和 DOM 元素类似,但是在语法上有些区别,比如: 传统的html:用双引号包裹,后面必须跟参数 <button onclick...5.用 key 提取组件 比方说,如果你提取出一个 ListItem 组件,你应该把 key 保留在数组中的这个 元素上,而不是放在 ListItem 组件中的 元素上...),而不是纯小写 使用 JSX 语法时你需要传入一个函数作为事件处理函数,而不是一个字符串 一、事件处理 1.事件绑定 React 元素的事件处理和 DOM 元素类似,但是在语法上有些区别,比如: 传统的...5.用 key 提取组件 比方说,如果你提取出一个 ListItem 组件,你应该把 key 保留在数组中的这个 元素上,而不是放在 ListItem 组件中的 元素上
= { nextReactRootIndex: 0, /** * 接收一个React元素,和一个dom节点 * @param {*} element React元素 * @param {*...new ReactDOMComponent(node); } } 我们增加了一个判断,这样当 render 的不是文本而是浏览器的基本元素时。...当然还有种情况是,两次生成的 element 差别太大,就不是一个类型的,那好办直接重新生成一份新的代码重新渲染一次就 o 了 _shouldUpdateReactComponent 是一个全局方法,这个是一种...而程序也可以好好的运行,实际上大部分都是 2 这种情况。 这是一种顺序优化,lastIndex 一直在更新,代表了当前访问的最右的老的集合的元素。...我们再来简单回顾下 React 的差异算法: 首先是所有的 component 都实现了 receiveComponent 来负责自己的更新,而浏览器默认元素的更新最为复杂,也就是经常说的 diff algorithm
这意味着,setState() 方法会创建一个带转换的 state, 而不是立即修改 this.state。如果在调用setState() 方法之后去访问 this.state ,则可能会返回现有值。...您可以延迟 XHR 调用,而不是在用户滚动时获取下一个结果集。 另一个很好的例子是基于 Ajax 的即时搜索。...} /> }) } 但是使用 index 作为 key, 被用在React虚拟DOM元素的时候,会使你的应用可能出现错误的数据 。...当您从列表中添加或删除元素时,如果该 key 与以前相同,则 React虚拟DOM元素表示相同的组件。...现在,如果我们用 Reselect 重写 addStaticPath ,问题就会消失,因为Reselect 将返回最后一个函数结果,直到它传递新的输入。
nextReactRootIndex: 0, /** * 接收一个React元素,和一个dom节点 * @param {*} element React元素 * @param {*} container...类型的实例对象,再调用对象的 mountComponent 返回 dom,最后再写到 container 节点中虚拟 dom虚拟 dom 无疑是 React 的核心概念,在代码中我们会使用 React.createElement...(node); }}我们增加了一个判断,这样当 render 的不是文本而是浏览器的基本元素时。...而程序也可以好好的运行,实际上大部分都是 2 这种情况。这是一种顺序优化,lastIndex 一直在更新,代表了当前访问的最右的老的集合的元素。...我们再来简单回顾下 React 的差异算法:首先是所有的 component 都实现了 receiveComponent 来负责自己的更新,而浏览器默认元素的更新最为复杂,也就是经常说的 diff algorithm
nextReactRootIndex: 0, /** * 接收一个React元素,和一个dom节点 * @param {*} element React元素 * @param {*} container...React.createElement 来创建一个虚拟 dom 元素。...(node); }}我们增加了一个判断,这样当 render 的不是文本而是浏览器的基本元素时。...而程序也可以好好的运行,实际上大部分都是 2 这种情况。这是一种顺序优化,lastIndex 一直在更新,代表了当前访问的最右的老的集合的元素。...我们再来简单回顾下 React 的差异算法:首先是所有的 component 都实现了 receiveComponent 来负责自己的更新,而浏览器默认元素的更新最为复杂,也就是经常说的 diff algorithm
领取专属 10元无门槛券
手把手带您无忧上云