Каков жизненный цикл компонента React в контексте Redux? - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь реструктурировать свое приложение React в Redux, и я запутался.

один сайт говорит:

Компоненты получают реквизиты от своих родителей,Эти реквизиты не должны изменяться внутри компонента.

другой говорит:

Раньше вы могли менять реквизиты с помощью setProps и replaceProps, ноони устарели.Во время жизненного цикла компонента реквизиты не должны меняться (считайте их неизменяемыми).

Поэтому я должен считать, что реквизиты являются неизменяемыми в течение срока службы компонента .Хорошо, тогда альтернатива - это состояние ( React состояние, которое, как я понимаю, сильно отличается от Redux состояние. ОК ...)

Состояние реагированияизменяемое состояние компонента.Он принадлежит компоненту и, в отличие от реквизита, может меняться в течение жизненного цикла компонента.ХОРОШО.Вне контекста Redux, я полностью понимаю это.Каждый компонент имеет свое собственное изменяемое состояние и передает то, что ему нужно, своим дочерним элементам в качестве реквизитов, которые являются неизменяемыми для дочерних элементов.Когда состояние изменится, это заставит компонент повторно визуализировать свои дочерние элементы, предоставляя им новые реквизиты по мере необходимости.

Теперь представьте Redux.Магазин Redux содержит состояние single для всего приложения.Это теперь заменяет любое состояние React?Все ли элементы состояния Redux доставляются компонентам React как реквизиты?Существует mapStateToProps, который, кажется, предполагает это.Итак, могу ли я теперь полностью забыть о состоянии React?

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

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Как отметил Дэн Абрамов в своей знаменитой статье . Вам может не потребоваться статья , содержащая избыточный код. Redux следует использовать только тогда, когда вам нужно постоянство для всего приложения.Когда данные эфемерны (представьте, что выбранный аккордеон открыт в простом виде), вы можете безопасно хранить свое состояние в локальном состоянии.Итак:

Заменяет ли это сейчас (Redux) какое-либо состояние React? Если хотите, да.Но это не обязательно.

Все ли элементы состояния Redux доставляются компонентам React как реквизиты? Обычно да.

Так можетТеперь я полностью забыл о состоянии Реакции? Да, вы можете.Хотя это и не обязательно, и локальное / избыточное состояние может жить счастливо вместе.

[...] означает ли это, что жизненный цикл длится столько времени, сколько требуется Redux для обновления своего хранилища? Рендеринг происходит при любых изменениях состояния (локальных или избыточных).

0 голосов
/ 19 декабря 2018

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

Action Creator-> Action-> dispatch-> Reducers-> State

Создатель действия - это функция, которая возвращает простой объект JavaScript, называемый действием.Действие будет иметь type и payload, которые предоставляют контекст того, что он делает, например, при создании страхового полиса, это будет выглядеть так:

// People dropping off a form (Action Creator)
const createPolicy = (name, amount) => {
  return { // Action(a form in this analogy)
    type: 'CREATE_POLICY',
    payload: {
      name: name,
      amount: amount
    }
  };
};

Все создатели действия выглядят идентично тому, чтовы видите, что здесь с небольшим разбросом.

Но я знаю, что вопрос заключается не столько в синтаксисе, сколько в понимании цикла и их целей.

Итак, вы хотите понять, какую роль нужны создателям ваших действий.играть в своем приложении React, а затем на ваших редукторах и выяснить их роль, но на самом деле после того, как вы выяснили сложную часть, создателей действий, остальные начинают становиться на свои места.

The dispatch получает действие и рассылает его всем различным Reducers.dispatch является частью самой библиотеки Redux, так что вам не нужно выписывать ее и задавать вопрос о mapStateToProps, если вы связываете его с компонентом более высокого порядка с помощью помощника connect(), весь этот процесс похож на руководствопереопределение процесса отправки.

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

Таким образом, создатели действия похожи на людей, подающих страховую заявку, а действие является действительной претензией.Эти претензии поступают в эти различные отделы, называемые редукторами.

Таким образом, если придерживаться этой аналогии страховых требований, то редуктор, который я, возможно, захочу создать, будет представлять собой редуктор истории исков, например:Таким образом, задача редукторов состоит в том, чтобы определить, заботится ли он о типе действия, которое он получает.Если он имеет значение type createClaim, то мы хотим убедиться, что код внутри функции извлекает свойство полезной нагрузки и добавляет его в список заявок, если нет, то возвращает список заявок без изменений, и это будет выглядеть так:

// Reducers (Departments)
const claimsHistory = (oldListOfClaims, action) => {
  if(action.type === 'CREATE_CLAIM') {
    // we care about the action (claim)
    return [...oldListOfClaims, action.payload]
  }
  // we dont care about the action (form)
};

Так что я просто использую синтаксис ES2015, который берет массив, берет все записи и добавляет их в новый массив и добавляет новую запись action.payload.

Егоэквивалент const numbers = [1,2,3], а затем [...numbers, 4], который выдает: (4) [1, 2, 3, 4]

или эквивалент oldListOfClaims.push(action.payload);, но между этим и тем, что я использовал, есть четкая разница.

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

Мы всегда хотим избегатьизменение существующих структур данных внутри редуктора.Вы никогда не увидите push() внутри редуктора.

Тогда есть случай, когда мы не заботимся о действии:

// Reducers (Departments)
const claimsHistory = (oldListOfClaims, action) => {
  if(action.type === 'CREATE_CLAIM') {
    // we care about the action (claim)
    return [...oldListOfClaims, action.payload]
  }
  // we dont care about the action (form)
  return oldListOfClaims;
};

Далее, вам нужно разобраться со случаем, когдав самый первый раз, когда вызывается редуктор, данные для него не передаются.По сути, мы получим значение undefined.Нам нужно установить значение по умолчанию для первого аргумента.

// Reducers (Departments)
const claimsHistory = (oldListOfClaims = [], action) => {
  if(action.type === 'CREATE_CLAIM') {
    // we care about the action (claim)
    return [...oldListOfClaims, action.payload]
  }
  // we dont care about the action (form)
  return oldListOfClaims;
};

Таким образом, undefined был заменен пустым массивом.

Таким образом, выяснение ваших действий и редукторов является сложной частью при реализацииRedux, а также соответствующие ему тонкие правила зерна, например, убедитесь, что вы не изменяете передаваемый массив, и всегда возвращаете какое-либо значение.

Общая цель редуктора - взятьнекоторые существующие данные передаются ему как действие и находят и возвращают эти существующие данные на основе содержимого действия.

Так что это все базовые вещи, с которых можно начать.Из всего этого вам нужно вернуть новый экземпляр магазина Redux.

В зависимости от вашего проекта у вас может быть от 1 до 3 или более создателей действий и редукторов.Затем вы соединяете все это в один объект, называемый хранилищем, который представляет собой просто набор различных действий и редукторов.

Итак, где-то в ваших компонентах вы добавите что-то вроде этого: const { createStore, combineReducer } = Redux;

Вот как выглядит combineReducers:

const ourDepartments = combineReducers({
  accounting: accounting,
  claimsHistory: claimsHistory,
  policies: policies
});

Затем вы завершаете создание своего магазина следующим образом:

const store = createStore(ourDepartments);

store;

store представляет все приложение Redux,Он содержит ссылки на все ваши разные редукторы и на все ваше состояние, созданное этими редукторами или данными.

Объект store имеет некоторые полезные функции, такие как функция dispatch.Чтобы вызвать dispatch(), мы должны передать действие, созданное создателем действия, а затем передать его store.dispatch().

const store = createStore(ourDepartments);

const action = createPolicy('Alejandra', 35);
console.log(action);

store.dispatch();

Когда вы выйдете из консоли action, вы должны увидеть васиметь тип действия и полезную нагрузку:

{type: "CREATE_POLICY", payload: {…}}

Затем вы выполняете это действие и передаете его store.dispatch() примерно так:

До сих пор вы, вероятно, видели ошибку, говорящую, что действие должнобудь простым объектом JavaScript и т. д., эта ошибка исчезнет, ​​как только вы передадите действие следующим образом:

store.dispatch(action);

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

console.log(store.getState());

{бухгалтерия: 135, претензийИстория: Массив (0), политик: Массив (1)} бухгалтерия: 135 претензийИстория: [] политики: ["Алехандра"] прото : Объект

Теперь вы можете начать передавать такие действия следующим образом:

store.dispatch(createPolicy('Alejandra', 35));
store.dispatch(createPolicy('Ben', 20));
store.dispatch(createPolicy('Daniel', 78));

store.dispatch(createClaim('Alejandra', 120));
store.dispatch(createClaim('Ben', 50));

store.dispatch(deletePolicy('Daniel'));

console.log(store.getState());

Вывод на консоль:

{accounting: 63, Applications История: Array (2),полисы: Array (2)} учет: 63 заявокИстория: Array (2) 0: {name: "Alejandra", amountOfMoneyToCollect: 120} 1: {name: "Ben", amountOfMoneyToCollect: 50} длина: 2 proto : политики Array (0): Array (2) 0: "Alejandra" 1: длина "Ben": 2 proto : Array (0) proto : Object

Вот так работает библиотека Redux

Хорошо, так что я показал вам, как этоработает сам по себе, но как две библиотеки, Redux и React, взаимодействуют друг с другом?

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

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

Допустим, у вас есть какое-то приложение типа iTunes, как бы мы собрали его только с Reactjs?

Так что это будетваше приложение без приставки:

enter image description here

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

С одним только React это будет простым и понятным приложением.

Так как ваше приложение меняется с Redux?

enter image description here

Так же, как и раньше, у нас будет компонент App,SongList и SongDetail, но компонент App будет передавать очень мало информации по SongList и SongDetail.

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

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

Наконец, мы хотим убедиться, что у нас есть создатель действий, чтобы каким-то образом изменить ваше состояние.Это единственный способ изменить свое состояние в приложении-избыточности.

Таким образом, создатель ваших действий может называться select song, который отправит действие и скажет выбранному редуктору песни обновить свои данные и отобразить новую выбранную в данный момент песню.

Так что это ваше приложение с Redux.

0 голосов
/ 17 декабря 2018

Пост Люси Бэйн хорош в качестве объяснения, но учтите, что упоминания setProps относятся к очень старой версии React, а связанные примечания к выпуску для React 0.14 описывают их как толькополезно для обновления компонента верхнего уровня в приложении.Сегодня, если вам действительно нужно обновить реквизиты для корневого компонента, вам нужно будет позвонить ReactDOM.render(<MyApp newProp={123} />) во второй раз.

См. Запись Redux FAQ о состоянии разделения между компонентами Redux и React для некоторых практических правил, которые помогут решить, где должен жить каждый элемент состояния.

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

...