元素数量一上来,react 就卡出翔了啊,怎么破?

#1

一个 list,里面一千个 item,然后就慢得无法忍受了,点击一个 item 好几秒以后才有反应。

最后发现元凶是子元素上绑定的 onClick 之类事件,去掉之后速度立马上来了。现在只好用 jQuery 把子元素的事件都委托到了父元素上。
话说这个 EventPluginHub.putListener 到底是啥机制啊……有什么优雅点的解法么……

感觉数据量一上来,react 宣称的性能优势对比与直接 dom 操作就显示不出来了。用 jQuery 的话可以精准地指定更新哪个节点,而用 react 每次必然要全部重新渲染,即使用 shouldComponentUpdate 啥的都优化过了,还是会有很明显的卡顿。

#2

值得关注。

#3

你是单纯点击,还是进行了一些 dom 操作?

#4

楼主,react的事件绑定,用的就是事件委托。

#5

没有直接 dom 操作,类似 TodoMVC 。用 TodoMVC 试了下,也是这样,1000 条 todo,点了三次全选,第一次非常慢,后面的就会好很多了,不知道是什么懒加载机制
然后区别是,TodoMVC 点击单条 todo 是很快的,我这里的项目点击单条也是跟全选一副德行,不知道是哪里姿势不对……

#6

我也是这么认为的,于是就放心大胆地写上了,结果有点跌眼镜……
有时间还是得好好啃一下

#7

virtual dom不是只渲染有改动的dom么?

#8

是不是和使用不当有关,有次开发没注意,六个TAB就把我卡出翔。

#9

性能问题,最突出的就是父组件的state变化后,子组件无论是否变化都会render。

办法就是,在shouldComponentUpdate进行判断,真正选择哪些需要渲染。

最佳方案就是,Immutable配合React.addons.PureRenderMixin。

通过这样来提升React的性能。

2 Likes
#10

遇到过一次这样的情况,就是在写一个 side by side 功能时,需要 渲染几千行的代码,我是接前面后端同事写的react 代码写的。在给某一行代码添加评论时,要把这个评论给添加到这行代码后面。在前几行代码添加评论还好,如果是给几千行后面的代码添加评论,会卡的不行。我的解决办法就是让评论的添加和评论的编辑和其父组件没有关系(没用到 shouldComponentUpdate 方法)。每行代码都有一个 click 绑定来触发添加评论的事件,并没有卡顿现象。
然后,当渲染代码达到几万行的时候,就不是 react 的问题,而是浏览器的问题,github 几万行代码渲染也只是隐藏不显示。

#11

请问有遇到过首次渲染列表速度慢的问题吗?

#12

这个只能改变无效渲染的部分,当需要setstate去渲染的时候还是会遇到卡顿的问题。。

#13

之前我也遇到了,后来想了一个方法。

#14

元素多了,react的dom diff反而降低了性能,比如1000个li,点击某个li,需要给这个li加class=“selected”,react必须要diff 这个1000个li,然后在render。这样的问题在手机h5上更明显,我在h5的上遇到类似的问题,只能减少li的数量,并做shouldComponentUpdate优化。

#15

也没必要必须用jquery啊。归根结底就是委托啊。你直接在list 父元素上绑定click 事件,根据e.target 来操作元素啊。不知道我说的对不对呢?

#16

react使用virtual dom, 如果只改变一个item,是不会导致整个list重新渲染,看看每个item里面有没有设置key.

#17

确实不会导致整个list重新渲染,但是还是会对整个list diff,这个list很大的时候,diff过程就会慢

#18

我遇到类似的问题,请问你有什么办法解决吗,求教:joy:

#19

最简单的方法,让你的每个Item去extend PureComponent而不是Component。PureComponent的意义和具体用法请自行google。

#20



以上两篇文章可以解决问题