reactjs - Redux:如何在另一个值更改时更新一个值?
问题描述
我的 React Native 应用程序处理 5 个数据实体。当应用程序启动时,我会显示一个加载屏幕并向 REST 后端发送 HTTP 请求,每个实体一个。当收到所有响应并完成数据加载后,我从加载屏幕导航到实际应用程序。
我Download
在 redux RTK 存储中创建了一个带有初始值的isLoadingEntity01
...标志的切片;我在触发 HTTP 请求之前将它们设置为,并在收到响应时将它们设置为。isLoadingEntity05
null
true
false
注意:我知道这是一种相当原始的方法;我也知道createAsyncThunk
(我还没有使用,那是另一天);以上几点仅用于说明上下文。
HTTP 响应显然是以任意顺序接收的。一些loadingIsComplete
标志的设置仍然是微不足道的:每当收到响应并isLoadingEntity
设置了其中一个时,检查它们全部五个,如果它们都是true
,设置loadingIsComplete
。
问题是:在哪里/如何做到这一点?
我的第一个想法是在每个 reducer 函数中实现这一点(并且,为了防止代码重复,将其封装在一个单独的函数中)。但是reducer 函数应该是纯粹的,并且设置loadingIsComplete
对我来说显然是副作用 - 特别是考虑到接收响应的任意顺序。
我的第二个想法是创建一个中间件(我刚刚成功地将其用于其他目的,请参阅此问题)。我认为这可行,但 IMO 我的问题应该很常见——我自己已经多次遇到这个问题,有时在同一个切片中,有时在商店的多个切片中——我有一种唠叨的感觉我错过了一些主要的 redux 概念。
我研究redux-thunk
了由 RTK 添加为默认中间件之一的. “thunk 是 Redux 的基本推荐的副作用中间件”听起来像是我的回答——但文档似乎主要关注异步逻辑——在我上面描述的情况下没有任何异步,这只是第二次更新在先前更新到另一个值时达到某个值。
redux-thunk
仍然是这种目的的合适工具吗?
我的问题是什么是规范的 Redux/RTK 方法来设置另一个值的变化?
PS:显然在问这里之前我做了研究,但是这个方向的大多数 SO 问题和博客文章似乎都围绕表单展开。
解决方案
干净简单
我不明白为什么你有 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 .. 这取决于您的数据结构。
希望我能帮助你,欢迎你添加代码或提高你的问题:)
推荐阅读
- c# - IAsyncEnumerable 和有什么区别
和一个迭代器生成的 IEnumerable >? - database - 如何删除 oracle 上的重复项,其中重复标准和标识符列不同,保持最新记录与其先前的更新
- reactjs - 从旧应用程序中删除 redux saga 的最佳方法?
- docker - 如何编写 Dockerfile 来运行另一个 docker 容器
- typescript - javascript set.has() 不是函数
- python - 无法从 python shell 运行 celery 任务
- php - 如何最好地使用 mb_convert_case 和像 o'hare 这样的字符串来实现 ucwords($str," '-")?
- ios - 当应用于 WKWebView 中的视频 srcObject 时,有什么方法可以防止 getUserMedia“直播”?
- python - 列表包含 Python 中的列表
- acumatica - 为什么这个字段没有被添加到 SOLine 表中