Ant-design-mobile: ListViewItem在上拉后,点击Item触发state更新后,Item没有重新render

Created on 18 Oct 2018  ·  14Comments  ·  Source: ant-design/ant-design-mobile

要实现一个长分页列表,点击每行item单选的需求,发现在ListView第一屏渲染是正常的,但是当上拉后,点击Item更新了state数据,Item并没有重新render,UI没有刷新,出现bug,有人知道是为什么吗。
环境:iOS11.3

Most helpful comment

还有一种方案就是在点击item事件里再setState一次
dataSource:this.state.dataSource.cloneWithRows(data).
然后初始化state里这么写.
dataSource:new ListView.DataSource({ rowHasChanged:() => true, }),

但是可能性能消耗会比较高

All 14 comments

好巧 我也刚碰到这个问题了, 很奇怪为什么这样 , 正在找, 试下了强制刷新都没用

@TonyLuLu 有解决办法,能告诉我一下吗,抱紧菜鸡的自己

@objHua 应该就是个组件bug, 以前有人提, 我看也没解决

提示#
ListView 有两种类型的滚动容器:
1、局部 div 容器
默认,注意:需要手动给 ListView 设置高度
2、html 的 body 容器

设置useBodyScroll后生效 (不需要设置高度)

@TonyLuLu 我解决了!之前我是用的第一种方法,设置了高度,然后死马当活马医(瞎弄),又设置了useBodyScroll后发现问题解决了,ps:又设置了initialListSize和pageSize

@objHua 不行啊, 我都加了, useBodyScroll={true}, initialListSize = {10} pageSize 以前就有, 还有什么配置吗?

@objHua 不行啊, 我都加了, useBodyScroll={true}, initialListSize = {10} pageSize 以前就有, 还有什么配置吗?

我刚刚试的时候,把initialListSize和pageSize设置的很大,所以看起来是没问题了,但是问题还是存在的,我再试试其他办法吧,这真是个巨坑啊,另外用useBodyScroll的时候,一定要设置initialListSize,但是我遇到另外一个问题,当用useBodyScroll的时候,上拉加载不会加载剩余的数据

@TonyLuLu 原因大概找到了,是rmc-list-view的实现逻辑bug,具体原因参考
https://github.com/react-component/m-list-view/issues/23
用rmc-list-view相同逻辑代码实现的list都会有这个问题

@objHua 恩, 只能换个组件或者自己写个吧

踩坑来了,有解决方案吗 @TonyLuLu

踩坑来了,有解决方案吗 @TonyLuLu

我的解决办法就是一次拿到全部数据,使用useBodyScroll方式,initialListSize设置为全部数据的长度,暂时满足了需求,建议不要使用这个组件做既有分页加载+item state刷新的需求,该组件满足不了

@objHua 这个大神在15年时提出了这个方案,https://stackoverflow.com/questions/33426760/react-native-listview-not-updating-on-data-change/。。。总的思路是把状态写在数据当中,通过复制选定的单条数据并更新该数据对应的状态值,就可以把状态更新进去了

解决办法就是别用ListView

还有一种方案就是在点击item事件里再setState一次
dataSource:this.state.dataSource.cloneWithRows(data).
然后初始化state里这么写.
dataSource:new ListView.DataSource({ rowHasChanged:() => true, }),

但是可能性能消耗会比较高

我遇到的情况差不多,在自定义的高度样式再加上一个overflow:scroll试试。。。。

Was this page helpful?
0 / 5 - 0 ratings