Redux For SwiftUI

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redux For SwiftUI相关的知识,希望对你有一定的参考价值。

参考技术A 创建动作,规定 View 不能直接操作 State,而只能通过发送 Action 的方式,间接改变存储在 Store 中的 State。

状态决定用户界面,将所有状态都保存在 Store 中

这样,根据 SwiftUI 特性,每当 State 有变化,就会抛出通知触发相关界面更新。

外部 View 使用属性:

Reduce 方法作为操作的核心,接受原有的 State 和发送过来的 Action,生成新的 State 和 command。用新的 State 替换 Store 中原有的状态,并用新状态来驱动更新界面。

dispatch 作为与 View 联系的接口 ,仅需要接收 action,内部调用reduce,将 OldState 和 action 传入即可。

我们希望 Reducer 具有纯函数特性,但是在实际开发中,我们会遇到非常多带有副作用 (side effect) 的情况:比如在改变状态的同时,需要向磁盘写入文件,或者需要进行网络请求。选择在 Reducer 处理当前 State 和 Action 后,除了返回新的 State 以外,再额外返回一个 Command 值,并让 Command 来执行所需的副作用。

写法:
提供 Command 协议,提供 execute 方法,因为回调结束之后要调用 store 接口改变 state,所以需要与 store 相关联,给 execute 附加一个参数 store

在 Redux-Toolkit 中使用 for 循环的问题

【中文标题】在 Redux-Toolkit 中使用 for 循环的问题【英文标题】:problem using for loop inside Redux-Toolkit 【发布时间】:2022-01-07 09:11:22 【问题描述】:

大家好,我在管理服务器回调中的数据时遇到问题,这是我第一次使用 Redux-ToolKit,所以这里是代码

  builder.addCase(FetchAllExpenses.pending , (state , action)=>
                state.situition = 'loading';
                // console.log(state.situition);
            ).addCase(FetchAllExpenses.fulfilled , (state , action)=>

                   const DataArray = [] ;              
                  expensesState = action.payload ;
                  for(let key in state.expensesState)
                    DataArray.push(new Expenses(key , state.expensesState[key].date , state.expensesState[key].source , state.expensesState[key].money , state.expensesState[key].Description , state.expensesState[key].month , state.expensesState[key].year))
                    ;
                    state.expensesState = DataArray ;
 
                    console.log(state.expensesState , 'after filitering');
                  state.reload = true ;
                  state.errorHappen = 'no error';
                  state.situition = `done`;

            )

结果

数组 [ 花费 “描述”:“巴哈克什”, "日期": "2021 年 11 月 30 日星期二 18:58:17 GMT+0800 (CST)", "id": "-MplYx54OqGKcLjbX74g", “钱”:“45484648”, “月”:10, “来源”:“医学”, “年”:2021年, , 花费 “描述”:“Vahac”, "日期": "2021 年 11 月 30 日星期二 18:58:25 GMT+0800 (CST)", "id": "-MplYz1NKqBZY1dp3Kgk", “钱”:“645495”, “月”:10, “来源”:“运输”, “年”:2021年, , ] 过滤后

SerializableStateInvariantMiddleware 耗时 108ms,超过了 32ms 的警告阈值。 如果您的状态或操作非常大,您可能需要禁用中间件,因为它可能会导致开发模式过慢。有关说明,请参阅https://redux-toolkit.js.org/api/getDefaultMiddleware。 它在生产版本中被禁用,因此您无需担心。 在warnIfExceeded中的node_modules/@reduxjs/toolkit/dist/redux-toolkit.cjs.development.js:217:16 在 node_modules/@reduxjs/toolkit/dist/redux-toolkit.cjs.development.js:456:12 中 在 node_modules/@reduxjs/toolkit/dist/redux-toolkit.cjs.development.js:374:39 中 在 __generator$argument_1 中的 node_modules/@reduxjs/toolkit/dist/redux-toolkit.cjs.development.js:1204:44 在 node_modules/@reduxjs/toolkit/dist/redux-toolkit.cjs.development.js:38:17 一步 在 node_modules/@reduxjs/toolkit/dist/redux-toolkit.cjs.development.js:19:56 中 在 node_modules/@reduxjs/toolkit/dist/redux-toolkit.cjs.development.js:97:21 完成

谢谢大家............

【问题讨论】:

【参考方案1】:

Redux 的核心使用原则之一是you should not put non-serializable values in state or actions.

避免将不可序列化的值(如 Promises、Symbols、Maps/Sets、函数或类实例)放入 Redux 存储状态或调度的操作。这确保了通过 Redux DevTools 进行调试等功能将按预期工作。它还确保 UI 将按预期更新。

如果你坚持使用,请看Working with Non-Serializable Data

但在您的情况下,我没有看到需要使用不可序列化数据(new Expenses())。只需使用 JavaScript 普通对象就足够了。

【讨论】:

感谢您的帮助

以上是关于Redux For SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

[React] Configure a React & Redux Application For Production Deployment and Deploy to Now

单元测试 react redux thunk dispatches with jest and react testing library for "v: 16.13.1",

如何确保所有使用redux的promise中的promise顺序正确?

将项目添加到 redux-toolkit 中的嵌套数组

React接入Sentry.js

如何在redux表单中使用不同的名称ID多次渲染相同的字段时验证字段