智能客服
你问我答,随时在线为你解决问题
大佬们好,我在做列表优化,之前用 ForEach 全量渲染太卡了,看官方文档说要用 LazyForEach + @Reusable 来做组件复用。
改完代码之后滑动确实流畅了不少,但新问题来了——数据开始串了。
具体表现是:快速滑动列表的时候,有时候 A 项的位置显示的是 B 项的内容,或者某个 Item 里的图片配的文字对不上。一开始以为是数据源的问题,打印了一下发现数据源本身是对的,问题出在 UI 渲染层。
我看了一下 @Reusable 的文档,里面有个 aboutToReuse 回调,说是“在复用组件即将被重用的时候触发,用于更新组件的状态”。但我没太理解这个回调的正确用法——我直接在 aboutToAppear 里更新 UI 数据,是不是因为组件被复用的时候 aboutToAppear 不会再触发,所以数据还停留在上一个 Item 的状态?
想请教几个问题:
@Reusable 标记的组件被复用时,生命周期是怎么走的? aboutToAppear 还会再触发吗?如果不会,那我应该在哪个回调里更新 UI 数据?
aboutToReuse 回调的正确用法是什么? 我看到文档说这个回调里可以拿到复用时的参数,具体应该怎么用?是不是在这个回调里把新数据赋值给组件内部的 @State 变量?
如果列表项里包含了图片加载,组件复用时图片会不会因为异步加载导致“旧图闪一下再变新图”的问题?怎么避免这种闪烁?
LazyForEach 的数据源需要实现 IDataSource 接口,这个接口里的 getData 方法返回的数据,跟 @Reusable 组件里实际显示的数据之间,是怎么关联的?如果数据错乱了,是不是因为 getData 返回的索引和实际渲染的索引对不上了?
我看到有人说 @Reusable 搭配 @ObjectLink 比搭配 @State 更稳,这个说法对吗?为什么?
这个问题说大不大,但列表数据串了直接影响用户浏览,体验很糟糕。希望有经验的大佬指点一下,谢谢!
我要提问题