В редукторе Redux, если состояние не определено, можете ли вы немедленно вернуть исходное состояние? - PullRequest
0 голосов
/ 12 февраля 2020

Я видел 3 вида редукторов:

// Form 1
function reducer(state, action) {
  if (state === undefined)
    return state = [];

  // handle action.type
  // ...
}

// Form 2
function reducer(state, action) {
  if (state === undefined)
    state = [];

  // handle action.type
  // ...
}

// Form 3
function reducer(state = [], action) {

  // handle action.type
  // ...
}

Они все одинаковые? Форма 1 и Форма 2 отличаются от Формы 1, немедленно возвращая исходное состояние, даже не смотря и не заботясь о action.type.

И я думаю, что Форма 2 и Форма 3 абсолютно одинаковы, используя значение параметра по умолчанию .

Могут ли какие-либо претензии быть обоснованы какими-либо официальными документами или спецификациями? Это означает, что в первый раз, когда вызывается редуктор, action.type не будет ничего значимым.

Ответы [ 3 ]

0 голосов
/ 12 февраля 2020

Вы можете просто использовать: createReducer из redux-starter-kit

Что также используется в этой демонстрации от Microsoft

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

Тело каждого редуктора case неявно оборачивается вызовом методаручки () из библиотеки immer. Это означает, что вместо возврата нового объекта состояния вы также можете напрямую изменить переданный объект состояния; затем эти мутации будут автоматически и эффективно переведены в копии, что обеспечит вам удобство и неизменность.

@ param initialState - Начальное состояние, которое должно быть возвращено редуктором.
@param actionsMap - Отображение типов действий в спецификаторы типов действий, определяемые c.

Использование

export const LocalStorageReducer = createReducer<Store['localStorage']>(
  new LocalStorage(), // <= where you define the init value of this state
  {
    storeLocalStorageInput(state, action) {
      return state = {...state, [action.payload.item]: action.payload.value};
    },
    clearLocalStorageInput(state, action) {
      return state = new LocalStorage();
    },
  }
);

export const reducer = combineReducers({
  localStorage: LocalStorageReducer,
...

тип createReducer

(alias) createReducer<LocalStorage, CaseReducers<LocalStorage, any>>(initialState: LocalStorage, actionsMap: CaseReducers<LocalStorage, any>): Reducer<LocalStorage, AnyAction>
import createReducer

образец состояния

export class LocalStorage {
  /**
   * Editing plan id in planner pages
   */
  planId: string | undefined;
  /***
   * Touched id list
   */
  touchedIdList: Array<string>;
  constructor() {
    this.planId = undefined;
    this.touchedIdList = Array<string>();
  }
}

Уже разработаны методы чтобы делать это с помощью libs, в большинстве случаев нет необходимости делать это вручную.

0 голосов
/ 12 февраля 2020
  • Redux инициализирует отправку «фиктивного» действия для заполнения состояния. Пожалуйста, отметьте это документы
  • Редукторам не разрешается возвращать неопределенное значение ни при каких условиях. При необходимости он может возвращать ноль

Технически все три одинаковы, как в первом время, когда редукторы будут вызываться с пустышкой, состояние больше не будет неопределенным в Form 1. При последующем вызове он будет вызван с осмысленным действием из кода вашего приложения, и как state = [] в это время он будет проверять action.type

0 голосов
/ 12 февраля 2020

В редукторе Redux, если состояние не определено, можете ли вы немедленно вернуть начальное состояние?

да, мы можем.

Но для этого вы не нужно проверять неопределенную или любую другую непустую проверку.

оператор по умолчанию switch будет обрабатывать его очень плавно.

function reducer(state, action) {

  switch(action.type){
      //rest case
      default:
      return state;
  }
}

// Form 2
function reducer(state, action) {

    switch(action.type){
        //rest case
      default:
      return state;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...