如何实现无限加载更多?append到state多了就回卡?

#1

简单描述下需求场景,用react写了一个webapp,有一个列表页面,属于类似微博的类型,上拉加载更多,可以一直拉。

this.state = { feeds: [] }

这个是我的state结构,基础数据可能类似

item = {
 username: '用户名',
 face: '',
 content: '',
 date: 'new'
}
```

上面是一个剪短的item

```
tmp = this.state;
tmp.push(item);
this.setState(tmp);
```

基本就是这样吧ajax的数据插入到列表里面,数据少还好,可是,如果state的数据越多,每次插入都会重新渲染,页面就会很卡。
不是操作元素卡,而是每次更新state的时候卡。
请教下各位,如果实现插入更多元素操作呢?
#2

没人回答么?

#3

无解,用分页吧,infinite scroll导致dom变多、javascript对象变多,这是正常的。
“什么值得买”的做法前3页下拉刷新;后面点击分页。

#4

但是,需求现在就是类app效果,可以无限加载更多,之前用jquery,可以直接append到dom里面,页面四五千条也不会卡,react,一百来条就卡死了,微信打开,直接吧微信都能搞崩溃。主要是react的重新渲染,会重新便利state有关,研究了几天,无解,哎!

#5

总觉得react做静态渲染还行,异步加载应该不是太好,也是因为这个,我们的wap就没用react,关注一下这个问题:horse_racing:

#6

我现在也后悔了~但是做了这么多东西了~不可能推翻~这块愁死我了~

#7

那列表这一块,手动操作DOM不就好了

#8

react大部分的性能消耗是在dom渲染。
这种就是没有优化好,render的时候,每条数据有没有单独做一个组件?如果单独做了一个组件,每个组件key设了什么?每个组件内部有没有做shouldComponentUpdate?理论上这些做好的话,每次只会render后加入的item。
另外,还可以做进一步优化,外面放一个空容器,根据state元素的数量计算容器的高度,render方法里只处理当前位置三屏左右(这个可以自己定)的元素,绝对定位到容器内。滚动的时候根据当前滚动高度重新render。

1 Like
#9

有道理

#10

-.-~!!
这样说吧,每个子元素都是react对象,里面一些按钮绑定了事件。
怎么手动操作dom?单纯类似jquery那种方式,操作dom,那个多简单。
问题是,子元素是react对象。

#11

每个子元素都是独立组件,但是,子元素里面有很多按钮,需要操作state

#12

可以把方法传进去

#13

我写的react-cnode列表页,数据多了就卡卡的,晚上我试试按照楼上的方法,能不能优化性能

#14

不如把Component怎么写的贴出来看看,理论上确实只会render有差异的东西

#15

已经验证过了,react不是指刷新有差异的数据~之前的数据,也会重新渲染~

#16

不然你试试把key值设置为数据的id

#17

shouldComponentUpdate返回false是不会渲染的,实际上,你只要判断nextProps.id 和 this.props.id就可以了

#18

刚试了一下楼上的方案,性能确实是优化不少

#19

楼主肯定是没加 key,加了唯一 key 还会是这样吗

#20

没加 key?