首页 > 解决方案 > Redux:如何在另一个值更改时更新一个值?

问题描述

我的 React Native 应用程序处理 5 个数据实体。当应用程序启动时,我会显示一个加载屏幕并向 REST 后端发送 HTTP 请求,每个实体一个。当收到所有响应并完成数据加载后,我从加载屏幕导航到实际应用程序。

Download在 redux RTK 存储中创建了一个带有初始值的isLoadingEntity01...标志的切片;我在触发 HTTP 请求之前将它们设置为,并在收到响应时将它们设置为。isLoadingEntity05nulltruefalse

注意:我知道这是一种相当原始的方法;我也知道createAsyncThunk(我还没有使用,那是另一天);以上几点仅用于说明上下文。

HTTP 响应显然是以任意顺序接收的。一些loadingIsComplete标志的设置仍然是微不足道的:每当收到响应并isLoadingEntity设置了其中一个时,检查它们全部五个,如果它们都是true,设置loadingIsComplete

问题是:在哪里/如何做到这一点?

我的第一个想法是在每个 reducer 函数中实现这一点(并且,为了防止代码重复,将其封装在一个单独的函数中)。但是reducer 函数应该是纯粹的,并且设置loadingIsComplete对我来说显然是副作用 - 特别是考虑到接收响应的任意顺序。

我的第二个想法是创建一个中间件(我刚刚成功地将其用于其他目的,请参阅此问题)。我认为这可行,但 IMO 我的问题应该很常见——我自己已经多次遇到这个问题,有时在同一个切片中,有时在商店的多个切片中——我有一种唠叨的感觉我错过了一些主要的 redux 概念。

我研究redux-thunk了由 RTK 添加为默认中间件之一的. “thunk 是 Redux 的基本推荐的副作用中间件”听起来像是我的回答——但文档似乎主要关注异步逻辑——在我上面描述的情况下没有任何异步,这只是第二次更新在先前更新到另一个值时达到某个值。

redux-thunk仍然是这种目的的合适工具吗?

我的问题是什么是规范的 Redux/RTK 方法来设置另一个值的变化?

PS:显然在问这里之前我做了研究,但是这个方向的大多数 SO 问题和博客文章似乎都围绕表单展开。

标签: reactjsreduxreact-reduxredux-thunkredux-toolkit

解决方案


干净简单

我不明白为什么你有 5 个“isLoadingEntity”。

但你可以写类似

const loadingIsComplete = isLoadingEntity01 && isLoadingEntity02 && ...

用 useMemo 包装它,如果 "loadingIsComplete" 则呈现您的应用程序,True否则保留加载程序。

你在哪里调用 HTTP 请求?我们可以看到一些代码吗?

简而言之,redux-thunk 只是统一了你所有的 reducer,所以你将拥有一个商店。对于 redux-thunk,您可以查看我的开源项目:

https://github.com/omergal99/hello-corona/blob/master/src/store/AppStore.js

关于更新商店中的一个值 - 我真的没有得到你的问题

但我可以告诉您,您可以在应用程序中的任何位置更新任何商店,您可以在 reducerY 更新后写入更新 reducerX .. 这取决于您的数据结构。

希望我能帮助你,欢迎你添加代码或提高你的问题:)


推荐阅读