React中如何用Dexie.js过滤查询字段,避免组件不必要重绘
解决Dexie.js中useLiveQuery不必要重绘的问题
当然可以,直接从查询层面优化就行,只获取你需要的id字段,就能避免因name变更触发的无意义重绘:
const friendsIds = useLiveQuery(async () => await db.friends.map(friend => friend.id).toArray() )
这么改的原因很直观:
- 原来的
toArray()返回完整的好友对象数组,只要对象里任意字段(比如name)变动,整个数组会被判定为有更新,触发组件重绘。 - 改成
map(friend => friend.id).toArray()后,查询返回的只是id组成的数组,只有当好友的id新增或删除时,这个数组才会变化;name这类其他字段的变更不会影响结果数组,组件自然不会触发重绘。
如果你的场景需要保留部分对象结构,但只想基于id的变化重绘,也可以配合useMemo做结果缓存,但上面的方式更直接高效,从源头上减少了不必要的数据监听。
内容的提问来源于stack exchange,提问作者tobiasBora
相关产品推荐
相关产品推荐

