Я создаю приложение, где мне нужно предварительно загрузить 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. Позволяет ли Дэн призывать другие редукторы вызывать вложенные редукторы?