React native 雷多克斯传奇
我对Redux传奇和生成器一般来说都是新手,所以我试图在分派之后执行其余代码之前,先“等待”分派的操作 例如:React native 雷多克斯传奇,react-native,redux,generator,redux-saga,React Native,Redux,Generator,Redux Saga,我对Redux传奇和生成器一般来说都是新手,所以我试图在分派之后执行其余代码之前,先“等待”分派的操作 例如: // Sideeffect to load messages on mount useEffect(() => { let mounted = true; if(mounted) { dispatch({ type: 'GET_THREAD_MESSAGES', threadId: _id })
// Sideeffect to load messages on mount
useEffect(() => {
let mounted = true;
if(mounted) {
dispatch({ type: 'GET_THREAD_MESSAGES', threadId: _id })
setIsLoading(false);
}
return () => {
dispatch({ type: 'CLEAR_FOCUSSED_MESSAGES' })
}
}, [])
当组件第一次装载时,它将发送GET\u THREAD\u消息
。我在我的rootSaga
中关注上述行为,包括以下内容:
export default function* rootSaga() {
yield all([
...
watchGetThreadMessages(),
watchClearFocussedMessages()
])
}
我的故事:
export function* watchGetThreadMessages() {
yield takeEvery('GET_THREAD_MESSAGES', getThreadMessages)
}
export function* getThreadMessages({ threadId, lastDate }) {
const { token } = yield select(state => state.auth);
try {
const { data } = yield call(getMessages, token, threadId)
yield put({
type: 'GET_THREAD_MESSAGES_SUCCESS',
allMessages: data.messages,
totalMessages: data.count
})
console.log('retrieved messages')
} catch(err) {
console.log(err)
}
}
getMessages
是对从服务器获取数据的我的端点的axios调用。问题是,组件装载后的setIsLoading
调度将在我从axios调用获取消息之前触发,因为它是异步的。通常,如果我正在提取组件内部的数据,我只会等待此响应,但不确定如何等待调度
操作。我通过将setIsLoading传递给调度并在传奇中启动setIsLoading来解决这个问题,但这不是最优雅的解决方案,如果有,我想知道一个更好的过程
有什么想法或建议吗?非常感谢您的任何操作。因为您的操作只是简单的同步函数,所以无法跟踪组件内的
isLoading
状态。您必须在redux存储中保持isLoading
,并连接到您的组件。每当调度GET\u THREAD\u MESSAGES\u SUCCESS
操作时,reducer将isLoading
值更改为false
。例如:
// Sideeffect to load messages on mount
useEffect(() => {
let mounted = true;
if(mounted) {
dispatch({ type: 'GET_THREAD_MESSAGES', threadId: _id })
setIsLoading(false);
}
return () => {
dispatch({ type: 'CLEAR_FOCUSSED_MESSAGES' })
}
}, [])
import React,{useffect}来自“React”;
从'react redux'导入{connect};
//isLoading道具映射到state.messages.isLoading
函数组件({isLoading,dispatch}){
useffect(()=>{
分派({type:'GET\u THREAD\u MESSAGES',threadId:'someId'});
}, []);
如果(孤岛加载){
返回一些加载器;
}
返回您的组件;
}
函数MapStateTops(状态){
返回{
isLoading:state.messages.isLoading,
};
}
导出默认连接(MapStateTops)(您的组件);
您的消息可能如下所示:
导出默认功能消息还原器(状态、操作){
开关(动作类型){
案例“获取线程消息”:
返回{
……国家,
孤岛加载:是的,
};
案例“获取线程消息成功”:
返回{
……国家,
孤岛加载:false,
allMessages:action.allMessages,
totalMessages:action.totalMessages,
};
违约:
返回状态;
}
}
太棒了,谢谢。我有一个fealing,这可能是解决方案,但想确保在我疯狂地将所有这些状态添加到我的redux商店之前。非常感谢。