Как я могу использовать this.state в this.state

Я хочу назначить 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,
    };
  }

Есть у кого-нибудь выкройка для этого?

Надеюсь, вы подумали и так оно вам действительно нужно ??? Почему вы хотите поддерживать одно и то же состояние двух переменных? Просто пытаюсь понять.

highhope 18.05.2018 15:06

@Jonas W ? Я не хотел, чтобы это было оскорблением, успокойся

highhope 18.05.2018 15:10

@JonasW. Ваш комментарий в порядке. Вы бы порекомендовали объявить whosPlaying за пределами this.state?

user9810728 18.05.2018 15:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
88
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Просто используйте промежуточную переменную:

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?

Bob van 't Padje 18.05.2018 15:08

Да, setState лучше

user9810728 18.05.2018 15:09

@bob нет. this.state = или this.state.whatever не запускают обновление состояния, поэтому все говорят вам использовать setState при изменении состояния. Однако внутри конструктора это нормально.

Jonas Wilms 18.05.2018 15:09

@noah нет, они делают разные вещи, нет ничего "лучше"

Jonas Wilms 18.05.2018 15:10

@JonasW. Лучше для меня в этом случае. Я сделал это, как и во втором примере, потому что я хочу иметь whosPlaying в this.state. Теперь он предупреждает меня: невозможно вызвать setState для компонента, который еще не смонтирован.

user9810728 18.05.2018 15:18

@noah liechti, как это связано с моим ответом ?!

Jonas Wilms 18.05.2018 15:41

@JonasW. Я сделал это так, как ты сказал мне в своем ответе. Как это не связано?

user9810728 18.05.2018 16:13

Я действительно не думаю, что состояние реакции должно использоваться таким образом. Если вы хотите сделать это, я бы просто объявил 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});

user9810728 18.05.2018 15:31

Другие вопросы по теме