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_SUCESSSIGN_IN_FAILURE 以恢复我的应用程序。

【讨论】:

您是否使用任何特定的方法来处理保存数据?例如,您是否有一些在某些事件时触发的中间件?还是直接调用数据保存函数(如 AsyncStorage.setItem(...))?至于异步状态,我已经在使用“状态”变量,并随着状态的进展更新它们,这是个好主意:) -- 编辑:刚刚看到你的编辑,我看到你直接调用了保存函数。感谢您的贡献:) 这就是redux-thunk 的美妙之处,一切都是状态甚至函数,只需创建一个自定义函数即可在任何被任何变量更改的事件时触发。我添加了一些代码进行澄清。 我刚刚发布了不到 1 小时,也许其他一些用户稍后会提出不同的意见。稍后我会选择一个答案,希望你能理解。

以上是关于redux-thunk 是不是应该管理设备上的数据加载和保存?的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何将“redux-thunk”用于异步初始状态? (反应/减少)

Redux-thunk “调度不是函数”

使用 Redux-thunk 调用操作不起作用

Redux-thunk - dispatch 不是一个函数

具有依赖关系的多个调用 redux-thunk

jest redux-thunk 测试是不是调度了相同模块的操作