redux-thunk应该管理设备上的数据加载和保存吗?

问题描述 投票:0回答:1

我在我的react-native项目中使用redux-thunk,我面临着一个情况,我不知道如何处理最好。

当一个动作被派发时(作为一个函数,所以redux-thunk首先处理它),我需要做2件事情:第一,用一个值更新Redux存储;第二,使用本地存储选项(AsyncStorage,SecureStore from Expo,等等)将这个值保存在设备上。

在其他一些情况下,我需要从设备上检索数据,并更新Redux存储。异步加载数据是使用redux-thunk的主要目的,所以我想是可以的。

然而,redux-thunk是否也应该管理设备上数据的保存?

在我看来,保存数据是主应用逻辑的一部分,让redux-thunk保存数据,就把这个任务变成了应用状态逻辑,这似乎有点不对。

你们怎么看?

react-native local-storage redux-thunk
1个回答
1
投票

好吧,我已经启动了许多不同的react项目,并在其中使用了以下功能 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 恢复我的申请。

© www.soinside.com 2019 - 2024. All rights reserved.