React native 雷多克斯传奇

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 })

我对Redux传奇和生成器一般来说都是新手,所以我试图在分派之后执行其余代码之前,先“等待”分派的操作

例如:

    // 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商店之前。非常感谢。