Я действительно не знаю, как описать максимально точно. Мне нужна какая-то функция инициализации после асинхронного вызова, которая будет вызываться только один раз, независимо от того, изменится ли состояние позже.
У меня есть компонент, и когда он монтируется, я делаю асинхронный запрос с помощью создателя действий, чтобы получить некоторые значения по умолчанию, также я вызываю somethingElse()
позже, что заставляет мой пользовательский интерфейс снова перерисовываться, потому что состояние было обновлено:
Вот создатель действия:
export function requestDefaults(){
return {
type: REQUEST_DEFAULTS,
payload: axios.get(ROOT_URL),
};
}
export function somethingElse(){
return {
type: SOME_OTHER,
payload: "Whatever",
};
}
И мой редуктор:
switch (action.type) {
case REQUEST_DEFAULTS:
return action.payload.data;
break;
case SOME_OTHER:
return action.payload;
break;
default:
return state;
}
В моем компоненте - когда он установлен, я делаю асинхронный запрос, а когда получаю ответ, я делаю пользовательский интерфейс видимым - в этом упрощенном случае кнопка, которая вызывает somethingElse
:
componentDidMount(){
this.props.requestDefaults();
}
render(){
// Have received async data show button - THIS NEEDS TO BE ONLY ONCE
if( this.props.defaults.data !== undefined ){
<a onClick={ this.props.someThingElse }>do it</a>
}
}
// REQUEST_DEFAULTS & SOME_OTHER
function mapStateToProps( { defaults, someOther} ){
return { defaults, someOther}
}
Теперь всякий раз, когда я вызываю this.props.someThingElse
, вносятся изменения в состояние, и в моей функции render()
кнопка снова перерисовывается, что является проблемой - мне нужно, чтобы она отображалась только один раз, когда я получаю асинхронные данные. Но теперь состояние было обновлено, и render()
вызывается снова, и поскольку теперь у меня есть this.props.defaults.data
, моя кнопка снова перерисовывается, но мне нужно, чтобы это было сделано только один раз после первого асинхронного вызова, а не при изменении состояния позже...