Я наткнулся на требование на участке вагона JS Webapp, для которого требуется отдельный объект определения «JSON» для рендеринга. Определения загружены через HTTP
запрос в самом начале, прочитать, разобрать и передать на другой уровень приложения. Сам объект никогда не изменяется на протяжении всего жизненного цикла.Обработать асинхронные действия, которые не сохраняют результат в состоянии
Я сейчас пытаюсь смоделировать этот сценарий в ReactJS, используя Redux + redux-thunk. Я создал действие thunk/async, извлекает объект JSON, извлекает все, что ему нужно, и заканчивает обновление состояния с этим - , но он не хранит сам объект. Это кажется правильным, логичным подходом, поскольку, как уже упоминалось, определения никоим образом не изменяются. Я бы сказал, что это просто не указано, в строгом смысле слова.
Однако, приняв это решение, я в конечном итоге боролся при реализации фактического React.Component
. Почти каждый example я видел там в дикой природе для асинхронных случаев, подобных этому:
- Определяет действие стука, что пожары некоторого API вызова.
- Хранит все, что бы они ни вернули (или после некоторых изменений) в государственной собственности.
- Сохранилось, что это свойство было
this.props
в компоненте сmapStateToProps
иconnect
.
В моем случае У меня на самом деле нет свойства государства для привязки к. Поэтому я вернул объект определений в свое асинхронное действие и использовал локальное состояние компонента, чтобы получить то, что мне нужно.
class ContainerComponent extends React.Component {
state = { definitions: {} };
componentDidMount() {
const { dispatch } = this.props;
dispatch(fetchDefinitions())
.then((definitions) => this.setState({ definitions }));
}
render() {
return (<PresentationalComponent definitions={this.state.definitions} />);
}
}
export default connect()(ContainerComponent);
Не говоря, что this.setState
be avoided должен, но это выглядит очень много, как то, что я еще до введения Redux: API вызов возвращается обещание - только с гораздо больше с вмешательством indirections.
componentDidMount() {
const { dispatch } = this.props;
fetch(`${API_URL}/definitions`)
.then((res) => res.json())
.then((definitions) => this.setState({ definitions }));
}
Итак, как мне это сделать? Есть ли какая-то особенная вещь, которую я здесь отсутствует? Любой образец, которым я должен следовать? Возможно, избегая Redux полностью для этого?
ОК. Ваше объяснение имеет смысл для меня - в некоторой степени. Ваш аргумент для включения огромного (не упоминал об этом, но он довольно большой в моем случае), почти бесполезный объект после его первого (и единственного) использования в общем состоянии показывает какой-то счетчик? Не похоже на хороший компромисс. Кроме того, я мог бы справиться с этим и с местным государством. Разве это не похоже на то, чтобы попытаться вместить решение в рамки? –
Redux - это просто инструмент управления государством. Вы можете использовать, если хотите, но вам это не нужно. Все, что вы делаете в разработке своего приложения, зависит от вас, и есть много способов для подобных целей. Всякий раз, когда я создаю приложение, я учитываю, когда запрос на API выходит из строя. Я не могу гарантировать, что мои «определения» всегда будут возвращаться ко мне, и я хотел бы, чтобы UX/UI был разработан, чтобы отражать, когда ответ получен или получен моим приложением. Если у вас есть функциональность и организационная структура, которые вам нужны без redux, не стесняйтесь ее удалять - это ваше приложение в конце концов. –
Достаточно честный. Мой вопрос был больше в строках: «Есть ли другой подход к этому, чем то, что я сделал?». Вы, конечно, дали один. Я принимаю ваш ответ. Благодаря! –