我在我的react-native项目中使用redux-thunk,我面临着一个情况,我不知道如何处理最好。
当一个动作被派发时(作为一个函数,所以redux-thunk首先处理它),我需要做2件事情:第一,用一个值更新Redux存储;第二,使用本地存储选项(AsyncStorage,SecureStore from Expo,等等)将这个值保存在设备上。
在其他一些情况下,我需要从设备上检索数据,并更新Redux存储。异步加载数据是使用redux-thunk的主要目的,所以我想是可以的。
然而,redux-thunk是否也应该管理设备上数据的保存?
在我看来,保存数据是主应用逻辑的一部分,让redux-thunk保存数据,就把这个任务变成了应用状态逻辑,这似乎有点不对。
你们怎么看?
好吧,我已经启动了许多不同的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_SUCESS
或 SIGN_IN_FAILURE
恢复我的申请。