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

Sup ya. Просто хочу уточнить, можем ли мы его использовать? Я думаю, мы можем просто быть уверены на 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)
    }
  }
});

person HackerMF    schedule 31.01.2021    source источник


Ответы (1)


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

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

Redux Toolkit использует 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/[email protected]/dist/immer.umd.production.min.js"></script>

person Linda Paiste    schedule 09.02.2021