#javascript #reactjs #react-redux #jsx
#javascript #reactjs #react-redux #jsx
Вопрос:
Здесь я пытаюсь передать данные между родственными компонентами A и B, где я хочу повторно отобразить компонент B после завершения асинхронного события в компоненте A.
class ParentComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
valueKey: '',
};
}
parentFunction(dataFromChild) {
this.setState({ valueKey: dataFromChild });
}
render() {
const { valueKey } = this.state;
return (
<div>
<componentA
url={url}
...
functionCallFromParent={() => this.parentFunction()}
/>
<componentB valueFromParent={valueKey} />
</div>
);
}
}
class componentA extends React.Component {
constructor(props) {
super(props);
this.state = {
items: null,
};
// asynchronous request made to server which updates the state when response received.
this._getTiles();
}
render() {
const { items } = this.state;
if (items amp;amp; items.asArray().length > 0) {
functionCallFromParent('Hello From Child1');
return (
<div>
{tiles}
</div>
);
}
return null;
}
}
Проблема в том, что каждый раз, когда ComponentA вызывает functionCallFromParent(), выполняется рендеринг ParentComponent, и он повторно отображает ComponentA и ComponentB, и этот цикл продолжается. В то время как я хочу, чтобы только ComponentB повторно отображался, когда ComponentA запрашивает это.
Комментарии:
1. Вы должны вызывать
functionCallFromParent
внутреннюю часть асинхронного кода (предположительно_getTiles
), а не в функции рендеринга2. @maya_nk99 но у меня нет нажатия кнопки или какого-либо пользовательского события.. Компонент B необходимо повторно отобразить по завершении асинхронного события, которое происходит в ComponentA
3. если asArray() функция в Javascript? Я думаю, что это на Python
4. Каждый раз, когда вы устанавливаете состояние, это вызывает повторный рендеринг компонентов, которые используют это состояние. Таким образом, это вызывает бесконечный цикл.
Ответ №1:
functionCallFromParent()
помещается внутрь render()
, ComponentA
что означает, что он будет вызываться каждый раз, когда компонент отображается / повторно отображается, что случается довольно часто! Когда это произойдет, ParentComponent.parentFunction()
будет вызван, чтобы установить свое собственное состояние, которое, в свою очередь, вызывает повторный рендеринг для себя и своих собственных дочерних элементов, и именно так создается цикл. Вы должны переместить это в ту часть кода, где вы получаете ответ.