Когда я делал это в прошлом, шаблон обычно прошел нечто вроде кода ниже. Вот несколько примечаний к этому коду:
getDataFromAPI()
Очевидно, что это HTTP-запрос или что-то подобное, что возвращает обещание, которое разрешает данные, которые вы хотите хранить в магазине. Конечно, вы можете сделать это с помощью обратных вызовов.
storeDataInStore()
- это вызов диспетчеру, который обрабатывает депозит данных в хранилище.
компонент прослушивает изменения в хранилище, так что, когда вы звоните getDataFromAPI()
и storeDataInStore()
последовательно, компонент будет услышать изменения в хранилище, вызовите метод handleStoreDataChange()
и повторно вынести надлежащим образом.
import LoadingComponent from './LoadingComponent';
import Store from '../../stores/ThatStore';
import { getDataFromAPI } from '../../utils/WebUtils';
import { storeDataInStore } from '../../utils/AppUtils';
class ThisComponent extends React.Component {
constructor() {
super(props);
}
componentWillMount() {
let dataFromStore = Store.getDataFromStore();
if (/* condition indicating data is in store */) {
this.setState(dataFromStore);
} else if (/* condition indicating data is not in store */) {
getDataFromAPI().then((data) => {
storeDataInStore(data);
});
}
}
componentDidMount() {
this.handleStoreDataChange = this.handleStoreDataChange.bind(this);
Store.addChangeListener(this.handleStoreDataChange);
}
componentWillUnmount() {
Store.removeChangeListener(this.handleStoreDataChange);
}
handleStoreDataChange() {
this.setState(Object.assign(Store.getDataFromStore());
}
render() {
if (/* condition indicating that you are awaiting data */) return <LoadingComponent />;
return (
/* All of the things you would render if the data is loaded in the store */
);
}
}