почему в функции makeMove в консоли пустой массив?
я новичек в реакт, никак не могу понять почему когда я нажимаю на шашку, а потом на пустое поле у меня в функции makeMove в консоли пустой массив ?
import React, { useState } from 'react';
import classes from './Board.module.css';
function Board() {
let [possibleMoves, setPossibleMoves] = useState([]);
let [currentСell, setCurrentCell] = useState(0);
let [board, setBoard] = useState([...Array(64)].map((_, ind) => {
const row = Math.floor(ind / 8);
const col = ind % 8;
const isBlack = (row + col) % 2 === 1;
const cellColor = isBlack ? classes.blackCell : classes.whiteCell;
if (ind > 39 && isBlack) {
return <div key={ind}className={cellColor}>
<div onClick={() => getPossibleMoves(ind)} className={classes.greenChecker} ></div>
</div>
} else if (ind < 24 && isBlack) {
return <div key={ind} className={cellColor}>
<div onClick={() => getPossibleMoves(ind)} className={classes.pinkChecker} ></div>
</div>
}
return <div key={ind} onClick={(e) => makeMove(e,ind)} className={cellColor}>{ind}</div>
}))
function getPossibleMoves(ind) {
setPossibleMoves([ind + 7, ind + 9, ind - 7, ind - 9].filter(el => {
if (el > 0 && el < 63 && board[el].props.className.includes('black')) return el;
else return false;
}))
}
function makeMove(e,ind) {
setCurrentCell(prevInd => ind);
console.log(possibleMoves)
}
return (
<div className={classes.board}>
{board}
</div>
);
}
export default Board;
Ответы (1 шт):
Автор решения: Gleb
→ Ссылка
useState берет значение из инициализатора только в момент первого вызова, и там соответственно функция захвачена на момент первого вызова, поэтому данные в ней как были в начале и не обновляются. Функции, как и все переменные, тоже пересоздаются каждый раз в момент вызова компонента. В вашем случае useState вообще не нужен. Просто сразу переменной board присваивайте то что в инициализаторе стейта.