Recoil里异步selector更新后组件为什么不重新渲染?
我在用Recoil做数据请求,定义了一个异步的selector,里面用fetch获取用户信息。但奇怪的是,数据明明已经返回了,useRecoilValue也拿到了最新值,可组件就是不重新渲染,页面还是显示旧的状态。
我试过把selector改成同步的mock数据,这时候一切正常。是不是异步selector有什么特别的注意事项?代码大概是这样:
const userInfoState = selector({
key: 'userInfo',
get: async () => {
const res = await fetch('/api/user');
return await res.json();
}
});
然后在组件里直接 const user = useRecoilValue(userInfoState);,结果user变了但UI没反应,求解!
一个常见的问题是,你需要确保你的异步selector正确地处理了loading状态,并且Recoil知道如何处理这个loading状态的变化。你可以尝试给selector加上一个
getCacheForUnvalidatedState方法,或者确保你的组件能够正确处理loading状态。不过,通常情况下,如果你发现异步selector导致组件不重新渲染,可以先检查一下是否有错误抛出,或者网络请求没有正确完成。可以在selector的get方法里加个try-catch,看看有没有异常发生。
另外,确保你的Recoil版本是最新的,有时候bugfix也会解决这类问题。
如果以上都没有解决问题,可以尝试手动触发一次Recoil的状态更新,虽然这不是一个优雅的解决方案,但在debug的时候可以试试:
不过理想情况下,应该能通过正常的Recoil机制来解决这个问题。希望这些建议对你有帮助。