Недавно начал изучать React, тренируюсь по туториалу на сайте React (делаю крестики-нолики, но с использованием Redux + параметры игры задаёт юзер), и столкнулся с проблемой:
Значение в двумерном массиве (значения ячеек поля) меняется очень странно, должно меняться только в одной ячейке, а меняется значение всего столбца (именно столбца).
Компонент поля:
class Board extends React.Component {
componentDidMount() {
this.props.setSquareValue() // нужно чтобы заполнить все ячейки null значениями
}
render() {
return (
<div id="board">
{this.props.squaresValue.map((item , i) =>
<div className="row" key={`row_${i}`}>
{item.map((square, j) =>
<div key={`row_${i}-col_${j}`} className="col p-0">
<Square location={[i, j]} squareValue={square}/>
</div>
)}
</div>
)}
</div>
);
}
}
export default connect(
state => ({
squaresValue: state.game.squaresValue
}),
dispatch => ({
setSquareValue(num) {
dispatch(setSquareValue(num));
}
})
)(Board);
Компонент ячейки:
function Square (props) {
return (
<div className="cell d-flex align-items-center justify-content-center">
<button className="btn" onClick={()=>{
props.setSquareValue(props.location, 'X');
}}>
{props.squareValue}
</button>
</div>
);
}
export default connect(
null,
dispatch => ({
setSquareValue(num, value) {
dispatch(setSquareValue(num, value));
}
})
)(Square);
Action:
export const setSquareValue = (num, value) => {
return (dispatch, getState) => {
if (num === undefined && value === undefined) {
let width = getState().gameParameters.fieldWidth;
let height = getState().gameParameters.fieldHeight;
return dispatch({ type:'SET_SQUARE_VALUE', values: Array(height).fill(Array(width).fill(null)) });
}
else { // Здесь происходит самое странное
let array = getState().game.squaresValue; // получаю двумерный массив значений
console.log(array); // Здесь почему-то массив уже изменён, хотя значение меняю в следующей строке
Т.е. если поле 3х3, и я нажимаю на ячейку [0,0], то значения поменяют ещё и ячейки [1,0] и [2,0]
array[num[0]][num[1]] = value; // num (координаты ячейки) приходит нормальный
return dispatch({ type:'SET_SQUARE_VALUE', values: array });
}
}
}