我有一个项目列表,由getItems
查询加载,每个项目都有一个按钮,可以在选定和未选定之间切换。我也有UI来创建一个新的项目添加到列表中。
当一个按钮在一个项目上被切换时,我会触发一个updateItem
变异,并乐观地更新getItems
缓存中的那个项目,这样按钮就能立即切换。在幕后,RTK进行updateItem
变异,当它成功并使该项目的标签无效时,它进行第二次getItems
查询以获取项目的最新数据。然后,这将拾取先前所做的远程更改并覆盖乐观更新。这工作正常,UI感觉快速和响应。
但是,我也需要能够创建新的项目。RTK Query不支持对新条目的乐观更新,所以我需要在条目列表前面显示一个加载微调器,并防止与之进一步交互,直到查询返回,使getItems
查询无效,并(重新)加载它们,这次将新创建的条目包含在返回的条目中。
如何让UI在这两种情况下表现不同:
- 如果
updateItem
的结果是乐观更新,我们将使UI处于正确状态,因此在重新获取getItems
期间不要显示微调器或锁定UI - 如果存在
createItem
突变,锁定UI并在重新获取getItems
期间显示微调器
这里的问题是,虽然我可以知道请求isFetching
,但当getItems
被重新获取时,我无法区分它为什么被重新获取,也无法知道是否有乐观更新。这意味着我无法决定是否显示微调器并锁定UI。
1条答案
按热度按时间nzk0hqpo1#
您可以使用listener中间件直接侦听
createItem
的突变,而不是依赖isFetching
。下面是一个示例实现:参考:https://redux-toolkit.js.org/api/createListenerMiddleware