У меня есть два компонента: приложение и ребенок. Моя цель состоит в том, чтобы приложение передавало идентификатор ребенку, и когда ребенок получает его в качестве реквизита, я хочу, чтобы ребенок выполнил запрос Axios / Fetch, а затем обновил себя данными результата. Я приму любой ответ, который предоставит мне пример исходного кода приложения / ребенка, который завершает мой пример или дает мне представление о том, действительно ли это возможно то, что я пытаюсь реализовать.
Я новичок в React.
// App.js
import React, { Component } from 'react';
import Child from './Child.js';
import './App.css';
class App extends Component {
state = {
id: 0
};
handleClick() {
this.setState({
id: this.state.id + 1
});
}
render() {
return (
<div>
<Child id = {this.state.id} />
<div>
<button onClick = {this.handleClick.bind(this)}>Pass new id down to Child component</button>
</div>
</div>
);
}
}
export default App;
// Child.js
import React, { Component } from 'react';
import axios from 'axios';
class Child extends Component {
state = {
data: null,
id: 0
};
loadData(q, cb) {
axios.get('http://localhost:3000/foo?q='+this.state.id)
.then(result => {
// ?
// this.setState would retrigger update and create an infinite updating loop
})
.catch(error => {
console.info('error: ' + error);
});
}
shouldComponentUpdate(nextProps, prevState) {
console.info('shouldComponentUpdate: nextProps = ' + JSON.stringify(nextProps) + ', prevState = ' + JSON.stringify(prevState));
// ??
}
getSnapshotBeforeUpdate(nextProps, prevState) {
console.info('getSnapshotBeforeUpdate: nextProps = ' + JSON.stringify(nextProps) + ', prevState = ' + JSON.stringify(prevState));
// ??
}
static getDerivedStateFromProps(nextProps, prevState) {
console.info('getDerivedStateFromProps: nextProps = ' + JSON.stringify(nextProps) + ', prevState = ' + JSON.stringify(prevState));
return {
id: nextProps.id
};
// ??
}
componentDidUpdate() {
console.info('componentDidUpdate');
}
render() {
return (
<div>
<div>data = {this.state.data}</div>
</div>
);
}
}
export default Child;
потому что loadData запускает setState, который в конечном итоге запускает componentDidUpdate
Но это еще не цикл. Чтобы это был цикл, componentDidUpdate() должен был бы всегда вызвать loadData(). Однако этого не происходит, только когда id был заменен. Прошло уже 7 недель, ты все еще зациклился на этом и даже не попробовал мое предложение?



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


Вы должны вызвать check prev Id с текущим идентификатором, чтобы избежать рекурсивного обновления. Вам просто нужно убедиться, что вы получаете состояние из реквизита только в том случае, если ваши реквизиты изменились,
static getDerivedStateFromProps(nextProps, prevState) {
if (nextProps.id !== prevState.id) {
return {
id: nextProps.id
};
}
return null;
}
Сообщите мне, если проблема не исчезнет
Если свойства изменились и состояние обновилось, вы вызовете loadData в componentDidUpdate.
почему там? он вызовет setState, который снова (и снова) обновит componentDidUpdate
Нет, вы ставите галочку в componentDidUpdate, чтобы избежать ненужных вызовов setState
static getDerivedStateFromProps(nextProps, prevState) {
if (nextProps.id !== prevState.id) {
// Returning this object is equivalent to setting state using this.setState
return {
id: nextProps.id
data: loadData(nextProps.id) // Something like this
};
}
return null; // Indicates no state change
}
loadData, вы можете использовать aync / await для возврата данных из вызова apiasync loadData(id) {
try {
// Make your api call here
let response = await axios.get('http://localhost:3000/foo?q='+id);
return await response.json();
} catch(err) {
// catches errors both in axios.get and response.json
// Make sure to not update state in case of any error
alert(err);
return null;
}
}
Примечание:
- This is not the complete solution as you might want to not update the state in the case where your api call in
loadDatacatches any error.- Also, since you are using api calls, you might want to limit the times pass props to the child cause they all will trigger different api calls and you will run into unpredictable states. Try debouncing.
В
componentDidUpdate()сравнитеprevProps.idиthis.state.id. Если они разные, позвоните вloadData(). (Я также не понимаю, как ваш ток мог создать бесконечный цикл?)