Я думаю, что подключенное диспетчерское действие (turnValueReducerRedux
) не вернет то, что вы ожидаете.Он вернет полное действие ({ type: '...', value: ... })
, а не только значение, что будет означать, что turnState будет неверным в следующем коде:
let turnState = this.props.turnValueReducerRedux(this.state.turn);
if(this.gameState.board[box.dataset.square] === '') {
this.gameState.board[box.dataset.square] = turnState;
Как общая рекомендация, кажется, вы не полагаетесь на state
или хранилище для рендеринга данных, что является одной из основных обязанностей Реагирует.Таким образом, вы устанавливаете значение в хранилище, отправляя действие, но никогда не обращаетесь к нему с помощью this.state.turnValue
, что определяется следующим кодом:
const mapStateToProps = state => {
return {
turnValue: state.turnValue
};
};
Также имейте в виду, что gameState
и state
сильно отличаются друг от друга, так как последний будет вызывать повторные рендеры и будет связан с магазином, тогда как первый не будет.
ОБНОВЛЕНИЕ
В соответствии с нашим обсуждением нижеВот пример, который использует другой подход: https://codesandbox.io/s/x2x773pqxz
Автоматический компьютерный игрок - сложная часть, так как это побочный эффект действия игрока-человека.Поэтому я добавил redux-thunk
, чтобы определенные действия вызывали другие действия.Я поставил задержку на поворот компьютера, чтобы вы могли увидеть его в действии.
Я также разделил доску и отдельные квадраты на отдельные компоненты, оба из которых предназначены исключительно для презентации.Компонент Game
и файлы redux/actions.js
являются наиболее важными.
Теоретически вы можете выбрать любой размер доски и количество игроков, но CSS просто настроен на доску 3х3.
Я не реализовал логику findWinner
, потому чтоэто было слишком много усилий much
Дайте мне знать, если я смогу что-то прояснить, надеюсь, это поможет!