Я хочу назначить this.state.currentPlayer на this.state.whosPlaying. Выдает ошибку TypeError: Cannot read property 'currentPlayer' of undefined at new Board.
constructor(props) {
super(props);
this.state = {
symbols: [X, O],
currentPlayer: Math.floor(Math.random() * 2),
fields: Array(9).fill(null),
whosPlaying: this.state.currentPlayer,
};
}
Есть у кого-нибудь выкройка для этого?
@Jonas W ? Я не хотел, чтобы это было оскорблением, успокойся
@JonasW. Ваш комментарий в порядке. Вы бы порекомендовали объявить whosPlaying за пределами this.state?



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


Просто используйте промежуточную переменную:
constructor(props) {
super(props);
const currentPlayer = Math.floor(Math.random() * 2);
this.state = {
symbols: [X, O],
currentPlayer,
fields: Array(9).fill(null),
whosPlaying: currentPlayer,
};
}
Или просто установите его после окончания литералов объекта:
this.state = { currentPlayer: Math.floor(Math.random() * 2) };
this.state.whosPlaying = this.state.currentPlayer;
Вы действительно можете просто установить такое состояние? this.state.whosPlaying = this.state.currentPlayer;? Разве вам не нужен метод setState?
Да, setState лучше
@bob нет. this.state = или this.state.whatever не запускают обновление состояния, поэтому все говорят вам использовать setState при изменении состояния. Однако внутри конструктора это нормально.
@noah нет, они делают разные вещи, нет ничего "лучше"
@JonasW. Лучше для меня в этом случае. Я сделал это, как и во втором примере, потому что я хочу иметь whosPlaying в this.state. Теперь он предупреждает меня: невозможно вызвать setState для компонента, который еще не смонтирован.
@noah liechti, как это связано с моим ответом ?!
@JonasW. Я сделал это так, как ты сказал мне в своем ответе. Как это не связано?
Я действительно не думаю, что состояние реакции должно использоваться таким образом. Если вы хотите сделать это, я бы просто объявил currentPlayer до того, как вы установите состояние. См. Пример ниже:
constructor(props) {
super(props);
const currentPlayer = Math.floor(Math.random() * 2)
this.state = {
symbols: [X, O],
currentPlayer,
fields: Array(9).fill(null),
whosPlaying: currentPlayer,
};
}
Вы не можете ссылаться на объект во время инициализации, если используете синтаксис литерала объекта.
Если вы хотите установить свойство на основе состояния на основе существующего свойства в объекте, вы можете сделать это в методе жизненного цикла componentWillMount().
Код будет выглядеть следующим образом:
Внутри конструктора ()
constructor(props) {
super(props);
this.state = {
symbols: [X, O],
currentPlayer: Math.floor(Math.random() * 2),
fields: Array(9).fill(null)
};
}
Внутри componentWillMount ()
this.setState((prevState) => { whosPlaying: prevState.currentPlayer });
Примечание: Если вы используете React 16.3+, вы можете рассмотреть возможность использования getDerivedStateFromProps ().
он работает с: this.setState ({whosPlaying: prevState.currentPlayer});
Надеюсь, вы подумали и так оно вам действительно нужно ??? Почему вы хотите поддерживать одно и то же состояние двух переменных? Просто пытаюсь понять.