Отправка другого действия / вызов другого редуктора внутри редуктора

#reactjs #redux

#reactjs #redux

Вопрос:

Я использую React с Redux и столкнулся с ситуацией, когда я хочу, чтобы один из моих редукторов отправил другое действие, но не уверен, как это сделать.

Созданный с помощью createSlice функции, у меня есть фрагмент для аутентификации и один для модалов. Я хотел бы вызвать hideModal действие из login редуктора моего фрагмента аутентификации, чтобы полностью скрыть модальный вход после отправки.

Причина, по которой я не могу просто вызвать dispatch(login()) сразу после dispatch(hideModal()) этого, заключается в том, что мне нужно сначала выяснить, есть ли какие-либо ошибки в данных формы, которые могут быть известны только внутри [login.fulfilled] редуктора, как login и асинхронный блок, созданный с использованием createAsyncThunk .

Я понимаю, что это своего рода анти-шаблон в React, поэтому было интересно, каков наилучший способ добиться этого?

Единственное решение, которое у меня есть modalSlice до сих пор, — это прослушивание login.fulfilled как часть его extraReducers объекта. Но это довольно грязно.

Любая помощь будет оценена, дайте мне знать, если этот вопрос недостаточно ясен, я постараюсь уточнить. Спасибо

Фрагмент аутентификации

 export const authSlice = createSlice({
    name: "auth",
    initialState: {
        loggedIn: false,
        userId: null,
        errors: []
    },
    extraReducers: {
        [login.fulfilled]: (state, action) => {
            if (action.payload.success) {
                state.loggedIn = true;
                state.userId = action.payload.userId;
                state.errors = [];
            } else {
                state.errors = action.payload.errors;
            }
        },
// Omitting rest of slice

  

Модальный фрагмент

 export const modalSlice = createSlice({
    name: "modal",
    initialState: {
        current: ""
    },
    reducers: {
        hideModal: (state) => {
            state.current = "";
        },
        showModal: (state, action) => {
            state.current = action.payload;
        }
    },

    // Possible solution: Works but quite messy 
    // and copies code from above rather than calling hideModal
    extraReducers: {
        [login.fulfilled]: (state, action) => {
            if (action.payload.success) {
                state.current = "";
            }
        },
// Omitting rest of slice
  

Ответ №1:

Причина, по которой я не могу просто вызвать dispatch(login()), за которым сразу следует dispatch(hideModal()), заключается в том, что мне нужно сначала выяснить, есть ли какие-либо ошибки в данных формы, которые могут быть известны только внутри редуктора входа.

Разве вы не можете выполнить проверку на наличие ошибок перед следующей отправкой? У вас есть доступ к хранилищу redux внутри вашего компонента

 dispatch(authLogin);
if (this.state.auth.errors) { // or however you are connecting to your store
  // do error handling stuff
} else {
 dispatch(closeModal);
}
  

Комментарии:

1. Я пробовал это, но поскольку вход в систему является асинхронным, с использованием промежуточного программного обеспечения react-thunk, возвращаемое значение можно надежно увидеть только в login.fulfilled редукторе