我正在构建一个应用程序,在启动应用程序时需要预加载people
和planet
数据(未来可能会增加更多的预加载需求)。我希望有一个值在存储中表示应用程序的全局状态为loaded: <boolean>
。只有当预加载要求people.loaded: true
和planet.loaded: true
都为true时,该值才为真。存储将如下所示:
Store
├── loaded: <Boolean>
├── people:
│ ├── loaded: <Boolean>
│ └── items: []
├── planets:
│ ├── loaded: <Boolean>
│ └── items: []
分离的 action creator 进行所需的异步请求,并分发由 `People` 和 `Planets` reducer 处理的 actions。如下所示(使用 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
处理从本地存储获取人物和星球数据,或者发起请求。
initApp()
动作创建器在呈现到DOM之前调用 site.js
中的其他动作创建器,如下所示:
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. 在store中拥有全局的loaded
状态是必要的吗?
3. 检查多个React组件中应用程序的loaded
状态的可扩展方法是什么? 在那些仅需要知道全局应用状态而不处理People
或Planets
渲染的容器中包含这些状态似乎并不正确。而且当全局loaded
状态在多个容器中需要时,管理起来也会很痛苦。
引用Dan在Redux - multiple stores, why not?问题中的回答部分。
使用reducer组合技术可以通过编写一个手动调用其他reducer的reducer,并按特定顺序提供其他信息来轻松实现“依赖更新”,类似于Flux中的waitFor。
4. Dan通过调用其他reducer指的是调用嵌套的reducer吗?