redux-thunk 是不是应该管理设备上的数据加载和保存?
Posted
技术标签:
【中文标题】redux-thunk 是不是应该管理设备上的数据加载和保存?【英文标题】:Should redux-thunk manage loading and saving data on the device?redux-thunk 是否应该管理设备上的数据加载和保存? 【发布时间】:2020-10-01 00:13:48 【问题描述】:我在我的 react-native 项目中使用 redux-thunk,但我面临的情况是我不知道如何最好地处理它。
当一个动作被调度(作为一个函数,所以 redux-thunk 首先处理它),我需要做两件事:首先是用一个值更新 Redux 存储;其次,是使用本地存储选项(AsyncStorage、Expo 的 SecureStore 等)将值保存在设备上。
在其他一些情况下,我需要从设备中检索数据,并更新 Redux 存储。异步加载数据是使用redux-thunk的主要目的,所以我想应该没问题。
但是,redux-thunk 是否也应该管理设备上的数据保存?
在我看来,保存数据是主要应用程序逻辑的一部分;让 redux-thunk 保存数据使这个任务成为应用程序状态逻辑,这似乎是不正确的。
你们觉得呢?
【问题讨论】:
【参考方案1】:好吧,我已经用redux-thunk
处理AsyncStorage
启动了许多不同的反应项目,我还没有遇到任何重大问题。我想这会归结为您更喜欢什么;因为无论哪种方式,它都会在同一个线程上运行。
根据我的个人经验,我喜欢将所有逻辑保存在同一个地方,而不是重复任何代码,这是将redux-thunk
添加到您的状态管理的动机之一。
最后,请记住,在加载和渲染时,您始终可以使用简单的dispatch
来表示状态,即:isLoading` 来处理所有不同的加载和渲染异步任务。 (:
让我们看看一些代码:
export const signin = (username, password) =>
return async (dispatch, getState) =>
dispatch(type: SIGN_IN_START, isLoading: true, )
// please DONT use this in real life and make sure to encrypt username and passwords!
// Use tokens, tokens are beautiful
await axios.get('http://someauth.com/user='.concat(username)).then(async function (res)
if (res.data[0] !== null)
await AsyncStorage.setItem('@myData', JSON.stringify(res.data[0]))
dispatch(type: SIGN_IN_SUCESS, isLoading: false, )
else
dispatch(type: SIGN_IN_FAILURE, isLoading: false, error: err)
).catch(function (err)
dispatch(type: SIGN_IN_FAILURE, isLoading: false, error: err)
)
对于这个例子,我可以设置 SIGN_IN_START
将加载状态设置为 true 并设置 SIGN_IN_SUCESS
或 SIGN_IN_FAILURE
以恢复我的应用程序。
【讨论】:
您是否使用任何特定的方法来处理保存数据?例如,您是否有一些在某些事件时触发的中间件?还是直接调用数据保存函数(如 AsyncStorage.setItem(...))?至于异步状态,我已经在使用“状态”变量,并随着状态的进展更新它们,这是个好主意:) -- 编辑:刚刚看到你的编辑,我看到你直接调用了保存函数。感谢您的贡献:) 这就是redux-thunk
的美妙之处,一切都是状态甚至函数,只需创建一个自定义函数即可在任何被任何变量更改的事件时触发。我添加了一些代码进行澄清。
我刚刚发布了不到 1 小时,也许其他一些用户稍后会提出不同的意见。稍后我会选择一个答案,希望你能理解。以上是关于redux-thunk 是不是应该管理设备上的数据加载和保存?的主要内容,如果未能解决你的问题,请参考以下文章