Redux:如何在另一个值更改时更新一个值?

Posted

技术标签:

【中文标题】Redux:如何在另一个值更改时更新一个值?【英文标题】:Redux: How to update one value upon another changing? 【发布时间】:2021-03-19 03:22:11 【问题描述】:

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

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

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

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

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

我的第一个想法是在每个 reducer 函数中实现这一点(并且,为了防止代码重复,将其封装在一个单独的函数中)。但是reducer functions should be pure 和将loadingIsComplete 设置给我显然是有副作用的——尤其是考虑到接收响应的任意顺序。

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

我查看了redux-thunk,由 RTK 添加为one of the default middleware(这给我的印象是每个人都在使用它,所以我也应该这样做); “thunk 是 Redux 的基本推荐的副作用中间件”听起来像是我的回答——但文档似乎主要关注异步逻辑——在我上面描述的情况下没有任何异步,这只是第二次更新在之前更新到另一个值时达到某个值。

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

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

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

【问题讨论】:

不确定您所说的“在另一个更改时设置一个值”是什么意思,通常在 React 中,答案是“不要”。除此之外,听起来您只需要 5 个动作创建者,每个动作创建者都会在成功后进入商店。在渲染等待屏幕以外的其他内容之前,您的应用将等待所有 5 个数据集都被填充 【参考方案1】:

干净简洁

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

但是你可以写类似的东西

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

如果 "loadingIsComplete" True 使用 useMemo 包装它并渲染您的应用程序,则保留加载器。

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

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

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

关于更新商店中的一个值 - 我没有真正明白你的问题

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

希望我能帮到你,欢迎你添加代码或尖锐你的问题:)

【讨论】:

以上是关于Redux:如何在另一个值更改时更新一个值?的主要内容,如果未能解决你的问题,请参考以下文章

当redux store中的值发生变化时,如何更新formik中的特定表单字段?

如何获得仅在 redux 状态的对象数组中的属性值更改时才发出的 Observable?

在另一个工作表中记录“RTD”值更改

如何在redux中更新特定数组项内的单个值

如何在数据绑定值更改时更新图像?

CustomCell 标签值更改时如何更新 UITableView?