React Redux中如何在消息处理reducer内获取activeConversation状态值?
原因说明
你应该是通过combineReducers方法拆分了不同模块的状态,Redux的分片reducer设计就是每个子reducer只能访问到它负责管理的那部分状态切片,所以你负责处理conversations的reducer拿到的state就只有conversations数组,自然无法直接获取activeConversation的值。
解决方案
方案1(最推荐):在thunk中获取全量状态传入action
thunk函数的第二个入参就是getState方法,可以拿到完整的全局状态,你直接在postMessage方法里获取activeConversation,再传入setNewMessage的payload即可。
修改后的postMessage代码:
export const postMessage = (body) => async (dispatch, getState) => { try { // 调用getState获取全局状态,取出activeConversation const { activeConversation } = getState(); if (!body.conversationId) { dispatch(addConversation(body.recipientId, data.message)); } else { // 将activeConversation作为参数传入action dispatch(setNewMessage(data.message, null, activeConversation)); } } catch (error) { console.error(error); } };
修改action定义,接收activeConversation并放入payload:
export const setNewMessage = (message, sender, activeConversation) => { return { type: SET_MESSAGE, payload: { message, sender: sender || null, activeConversation }, }; };
之后你在处理conversations的reducer里直接从action.payload.activeConversation取值即可。
方案2:合并关联度高的reducer
如果activeConversation和conversations的业务关联度很高,你可以不用拆成两个独立的子reducer,合并为同一个reducer管理,就能直接在reducer内部访问到两个状态:
const initialState = { activeConversation: "", conversations: [] } const chatReducer = (state = initialState, action) => { switch (action.type) { case SET_ACTIVE_CHAT: return { ...state, activeConversation: action.username } case SET_MESSAGE: return { ...state, // 这里直接用state.activeConversation即可 conversations: addMessageToStore(state.conversations, {...action.payload, activeConversation: state.activeConversation}) } default: return state } }
方案3:使用中间件监听action
如果不想修改现有reducer拆分结构,也可以用Redux中间件(比如Redux Toolkit的createListenerMiddleware)监听SET_MESSAGE动作,在中间件中获取全量状态后再处理后续逻辑,不过该方案复杂度更高,非必要不推荐。
内容的提问来源于stack exchange,提问作者Josh Susa
相关产品推荐
相关产品推荐

