【发布时间】:2020-12-13 22:01:10
【问题描述】:
从下面的代码中,虽然我确实使用较新的数组调用 setSnake 函数,但蛇变量 ( state var ) 在第一次按键后不会更新... 在进一步按键时,snake 的值始终为 {x:0, y:1 }( 如果您按右箭头键
知道为什么吗?
const SnakeBoard = () => {
const width=10;
const height=10;
let initialRows = []
for(let i=0;i<10;i++){
initialRows.push([])
for(let j=0;j<10;j++)
{
if( i==0 && j == 0)
initialRows[i].push('snake')
else
initialRows[i].push('blank')
}
}
const [rows, setRows] = useState(initialRows)
const [snake, setSnake] = useState([{x:0,y:0}])
const displaySnake = ()=>{
const newRows = rows;
snake.forEach(cell=>{
newRows[cell.x][cell.y] = 'snake'
})
// console.log('newRows')
// console.log(newRows)
setRows(newRows);
}
const changeDirectionWithKeys = (e)=>{
e.preventDefault()
const {key} = e
console.log(key)
moveSnake(key)
}
const moveSnake =(key) =>{
const newSnake = []
switch(key){
case 'ArrowRight':
newSnake.push({x: snake[0].x, y: snake[0].y + 1})
break;
case 'ArrowLeft':
newSnake.push({x: snake[0].x, y:snake[0].y - 1})
break;
case 'ArrowUp':
newSnake.push({x: snake[0].x - 1, y:snake[0].y})
break;
case 'ArrowDown':
newSnake.push({x:snake[0].x + 1, y: snake[0].y})
break;
}
if(snake.length !==1){
snake.forEach(cell=> {
newSnake.push(cell);
})
}
console.log(newSnake)
console.log(snake)
setSnake(...newSnake)
displaySnake()
}
useEffect(() => {
window.addEventListener('keyup',changeDirectionWithKeys)
return () => {
window.removeEventListener('keyup',changeDirectionWithKeys)
}
}, [])
const diplayRows = rows.map( (row,index) =>
<li>
{row.map((e,ind)=>{
switch(e){
case 'blank':
return <span>{index} - {ind} |</span> ;//<img src={Blank} alt="blank"></img>
case 'snake':
return <span>{index} - {ind} |</span> ;//<img src={Snake} alt="snake"></img>
}
})}
</li>
)
return (
<div>
<UL>
{diplayRows}
</UL>
</div>
)
}
export default SnakeBoard
【问题讨论】:
-
你正在使用 React,那么你为什么要改变现有的状态?永远不要在 React 中改变状态
-
你能创建一个 fiddle/sn-p 吗?
-
尝试从 setSnake(...newSnake) 中删除扩展运算符 (...)。所以把它改成 setSnake(newSnake)。