javascript - React 有没有办法在不构建虚拟树的情况下更新 DOM?

标签 javascript performance reactjs

想象一个包含 100 个项目的列表。有一个组件可以显示所有这些。每秒应多次将一个(随机)项目移动到新位置。 React naive 方法是通过构造虚拟树来重新渲染整个组件,然后将其与之前的副本进行比较,然后修补 DOM。问题是制作虚拟树和创建差异需要时间(在我的例子中大约 50 毫秒)。

React 有没有办法跳过虚拟树的创建并计算差异?如下所示:shouldComponentUpdate 将返回 false;然后手动将一个 Node 从 DOM 中删除,并插入到另一个位置。

更新

关于this video React 中存在最坏的情况。当您仅更新 100 项中的一项时。问题是如何以最快的方式更新 DOM(不比较 100 个项目)?

This is the demo对于这个问题,以及 this is the code .

Needle in haystack problem

最佳答案

您只需访问 componentDidMount 中的 DOM。

但是由于您遇到了性能问题。我会尝试让你的 child 渲染函数“纯粹”。您可以使用 PureRenderMixin ,但因为 mixins 可能不会留在你身边

从'react/lib/shallowEqual'导入shallowEqual;

然后在您的 shouldComponentUpdate 函数中执行

shouldComponentUpdate(nextProps, nextState) { return !shallowEqual(this.props, nextProps) || !shallowEqual(this.state, nextState); }

另请考虑使用 Immutable-JS用于存放您的 100 件元素 Map因为它将最大限度地减少复制或缓存数据的需要。

关于javascript - React 有没有办法在不构建虚拟树的情况下更新 DOM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30303342/

相关文章:

javascript - 如何在 react 中使用向上和向下箭头键使下拉菜单工作

reactjs - 是否可以在类内部和方法外部声明变量

javascript - 数组中的所有对象都会受到影响

javascript - Rails 3.2.2 不执行 rjs

javascript - 正则表达式:如何匹配所有大于 49 的数字?

Android:Joda 删除时区原始文件

sql - 更新涉及 groupby 子句的表,同时避免使用临时表

android - 我想知道 android 中 Activity 和服务之间的线程流

javascript - Flask 处理前端 AJAX 调用错误的正确方法

javascript - 让 Vue.js 使用 $set() 检测数组的更改