Срез инструментария Redux. Чистые функции внутри редукторов полей

#redux-toolkit

#redux-инструментарий

Вопрос:

Спасибо. Просто хочу уточнить, можем ли мы его использовать? Я думаю, мы можем просто хотеть быть уверенными на 100%

https://codesandbox.io/s/redux-toolkit-state-new-array-4sswi?file=/src/redux/slices/slice.js:111-425

 const someSlice = createSlice({
  name: "someSlice",
  initialState: {
    users: [],
    status: ""
  },
  reducers: {
    actionSuccess: (state, { payload }) => {
      state.users = payload.users;
    },
    actionFailure: (state) => {
      // can we use here function?
      statusHandler(state)
    }
  }
});
 

Ответ №1:

Редуктор не должен вызывать никаких побочных эффектов. То есть он не должен делать ничего, кроме изменения содержимого состояния. Таким образом, вы не должны вызывать a statusHandler , который вызвал бы внешние эффекты.

Если ваша statusHandler функция ничего не делает, кроме обновления состояния, это, похоже, работает в моем тестировании, и я не знаю ни одной причины, по которой это не должно быть хорошо.

Инструментарий Redux использует Immer за кулисами для обработки неизменяемых обновлений, поэтому этот вопрос в основном сводится к тому, эквивалентны ли эти две функции updatedInline и updatedExternally . Насколько я могу судить, они есть.

 const {produce} = immer;

const initialState = {
  status: ''
};

const updatedInline = produce( initialState, draft => {
  draft.status = 'failed';
})

const mutateStatus = (state) => {
  state.status = 'failed';
}

const updatedExternally = produce( initialState, mutateStatus )

console.log("Updated Inline: n", updatedInline);
console.log("Updated Externally: n", updatedExternally); 
 <script src="https://cdn.jsdelivr.net/npm/immer@8.0.1/dist/immer.umd.production.min.js"></script>