Допустим, используя React.js, у меня есть родительский компонент, у которого есть список в состоянии:
myList: [1, 2, 3]
Я делаю .map() для myList и визуализирую новый компонент для каждого элемента в списке. Итак, у моего родительского приложения теперь есть дочерние компоненты.
Допустим, внутри этого дочернего компонента я запускаю метод myMethod и где-то в середине этого метода я обновляю переменную состояния myList родительского компонента.
Это вызовет повторный рендеринг дочерних компонентов (включая текущий компонент) (правильно?), который выполняет myMethod, но еще не завершил выполнение всех строк этого метода.
Главный вопрос:
Что произойдет с любыми оставшимися строками кода внутри метода myMethod, которые идут после строки, вызывающей повторную визуализацию компонента метода?
(Будут ли они по-прежнему выполняться или выполнение прервется? Что-то более тонкое?)
разве это не должен быть бесконечный цикл? дочерние элементы обновляют состояние родителя, родитель снова перерисовывает своих дочерних элементов
Я предполагаю, что любой оставшийся код будет прерван, поскольку компонент будет повторно отображаться. Но я не знаю, как React работает на этом уровне, поэтому не знаю, поэтому и спрашиваю. У меня есть конкретная ситуация, когда я хочу сначала обновить состояние некоторого родительского компонента, вызывая повторную визуализацию дочернего элемента, в то время как дочерний элемент все еще должен выполнить некоторый код, включая запрос axios к бэкэнду.
setState является асинхронным, поэтому он не обновляет состояние вашего родительского компонента немедленно. Таким образом, оставшийся код внутри метода myMethod не будет прерван. Весь оставшийся код выполняется и только после того, как состояние родительского компонента будет обновлено, это вызовет повторную визуализацию. А также, если вы хотите, вы можете обновить состояние дочернего компонента (после того, как ваш запрос axios к серверной части был разрешен) внутри того же метода myMethod.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


setState является асинхронным, поэтому он не обновляет состояние вашего родительского компонента немедленно. Таким образом, оставшийся код внутри метода myMethod не будет прерван. Весь оставшийся код выполняется и только после того, как состояние родительского компонента будет обновлено, это вызовет повторную визуализацию. А также, если вы хотите, вы можете обновить состояние дочернего компонента (после того, как ваш запрос axios к серверной части был разрешен) внутри того же метода myMethod.
например:
import React, { Component } from "react";
import ReactDOM from "react-dom";
const getRandomInt = (min, max) => {
return Math.floor(Math.random() * (max - min + 1)) + min;
};
class Parent extends Component {
state = {
list: [1, 2, 3]
};
parentHandler = value => {
this.setState({ list: [...this.state.list, value] }, () =>
console.info("parent component state updated")
);
};
render() {
return (
<div>
{this.state.list.map(item => (
<Child key = {item} item = {item} parentHandler = {this.parentHandler} />
))}
</div>
);
}
}
class Child extends Component {
state = {
id: 24
};
fakePromsise = () => {
const newId = getRandomInt(24, 60);
return new Promise((resolve, reject) => {
setTimeout(() => resolve(newId), 5000);
});
};
childHandler = listItem => {
let newItem = listItem + getRandomInt(10, 1000);
// handling parent state
this.props.parentHandler(newItem);
// handling fake promise
// and when the promise resolves
// update the component state
this.fakePromsise().then(data =>
this.setState(
{
id: data
},
() => console.info("child component state updated")
)
);
// after the loop completes
// parent state is updated
for (let i = 0; i < 5000; i++) {
console.info("i", i);
}
};
render() {
return (
<div>
<h1 onClick = {() => this.childHandler(this.props.item)}>
{this.props.item} click me!!!
</h1>
<p>Id: {this.state.id}</p>
</div>
);
}
}
ReactDOM.render(<Parent />, document.getElementById('root'));
you can use the example and see the console result. Just click the
h1tag. After which newChildcomponent is added and the clickedChildcomponentidis changed.
Почему бы им прервать? Кроме того, вы столкнулись с конкретной проблемой, или это просто общий вопрос?