У меня есть компонент, в котором я получаю данные на основе идентификатора элемента, который был нажат ранее. Выборка успешна, и console.log показывает правильные данные, но данные теряются с помощью this.setState. У меня есть componentDidUpdate и componentDidMount в одном и том же компоненте, не уверен, что это нормально, или, может быть, эти двое портят друг друга?
Вот код:
const teamAPI = 'http://localhost:8080/api/teams/'
const playerAPI = 'http://localhost:8080/api/playersByTeam/'
const matchAPI = 'http://localhost:8080/api/match/'
class View extends Component {
constructor() {
super();
this.state = {
data: [],
playersData: [],
update: [],
team1: [],
team2: [],
matchData: [],
testTeam: [],
};
}
componentDidUpdate(prevProps) {
if (prevProps.matchId !== this.props.matchId) {
fetch(matchAPI + this.props.matchId)
.then((matchResponse) => matchResponse.json())
.then((matchfindresponse) => {
console.log(matchfindresponse);
this.setState({
matchData:matchfindresponse,
testTeam:matchfindresponse.team1.name,
})
})
}
}
componentDidMount() {
fetch(teamAPI)
.then((Response) => Response.json())
.then((findresponse) => {
console.log(findresponse)
this.setState({
data:findresponse,
team1:findresponse[0].name,
team2:findresponse[1].name,
})
})
fetch(playerAPI + 82)
.then(playerResponse => playerResponse.json())
.then(players => {
console.log(players)
this.setState({
playersData:players
})
})
}
Первый рендер также выдает это предупреждение:
Warning: Can only update a mounted or mounting component. This usually means you called setState, replaceState, or forceUpdate on an unmounted component. This is a no-op.
Please check the code for the View component.
Все из ComponentDidMount прекрасно работает при рендеринге, но {this.state.matchData} и {this.state.testTeam} из componentDidUpdate пусты.
Может ли быть проблема в том, что ComponentDidMount повторно отображает компонент, что приводит к потере данных из ComponentDidUpdate, и если да, как я могу это исправить?
Попробовал ComponentWillReceiveProps, как это, но все равно не повезло
componentWillReceiveProps(newProps) {
if (newProps.matchId !== this.props.matchId) {
fetch(matchAPI + newProps.matchId)
.then((matchResponse) => matchResponse.json())
.then((matchfindresponse) => {
console.log(matchfindresponse.team1.name);
console.log(this.props.matchId + ' ' + newProps.matchId);
this.setState({
matchData:matchfindresponse.team1.name,
})
})
}
}