Я создаю приложение, где мне нужно предварительно загрузить people и planet данные (вероятно, что в будущем могут быть добавлены дополнительные требования предварительной загрузки) при запуске приложения. Я хочу иметь значение в хранилище, которое представляет глобальное состояние приложения как loaded: <boolean>. Значение будет истинным только тогда, когда требования предварительной загрузки people.loaded: true и planet.loaded: true верны. Магазин будет выглядеть примерно так:
Store
├── loaded: <Boolean>
├── people:
│ ├── loaded: <Boolean>
│ └── items: []
├── planets:
│ ├── loaded: <Boolean>
│ └── items: []
Отдельные создатели действия делают необходимые асинхронные запросы и действия отправки, которые обрабатываются редукторами people и Planets. Как показано ниже (использует redux-thunk):
actions/index.js
import * as types from '../constants/action-types';
import {getPeople, getPlanets} from '../util/swapi';
export function loadPeople () {
return (dispatch) => {
return getPeople()
.then((people) => dispatch(addPeople(people)));
};
}
export function loadPlanets () {
return (dispatch) => {
return getPlanets()
.then((planets) => dispatch(addPeople(planets)));
};
}
export function addPeople (people) {
return {type: types.ADD_PEOPLE, people};
}
export function addPlanets (planets) {
return {type: types.ADD_PLANETS, planets};
}
export function initApp () {
return (dispatch) => {
loadPeople()(dispatch);
loadPlanets()(dispatch);
};
}
../util/swapi обрабатывает выборку людей и данных планеты либо из LocalStorage, либо из запроса.
initApp() action creator вызывает других создателей действий в site.js непосредственно перед рендерингом в DOM, как показано ниже:
site.js
import React from 'react';
import {render} from 'react-dom';
import Root from './containers/root';
import configureStore from './store/configure-store';
import {initApp} from './actions';
const store = configureStore();
// preload data
store.dispatch(initApp());
render(
<Root store={store} />,
document.querySelector('#root')
);
1. Каковы наилучшие методы управления глобальным состоянием предварительной загрузки приложения в Redux?
2. Имеет ли глобальное состояние loaded в хранилище?
3. Что может быть масштабируемым способом проверки состояния приложения loaded в нескольких компонентах React? Неправильно включать people и planet состояние для контейнеров, которые просто должны знать состояние глобального приложения и не обрабатывает рендеринг people или Planets. Также было бы больно управлять, когда глобальное состояние loaded было бы необходимо в нескольких контейнерах.
Цитата из ответа Dan от Redux - несколько магазинов, почему бы и нет? вопрос.
Использование композиции редуктора позволяет легко реализовать "зависимые обновления" a la waitFor в Flux, написав редуктор, вручную вызывающий другие редукторы с дополнительной информацией и в определенном порядке.
4. Позволяет ли Дэн призывать другие редукторы вызывать вложенные редукторы?