javascript - 子状态未正确呈现
问题描述
我正在制作一个二十一点应用程序,并且在最初的牌局之后重新渲染牌局时遇到了麻烦。我正在尝试更新 App.js 中的状态并将其传递给 PlayerHand.js 以进行渲染,但子组件并未重新渲染,即使 console.log 显示状态已在 App 中更新。有趣的是,如果我在文本编辑器中按 ctrl-s,PlayerHand.js 将更新,即使我实际上没有更改代码中的任何内容。
应用程序.js
function App() {
const [lobbyState, updateLobbyState] = useState('');
const [playerHand, updatePlayerHand] = useState([]);
//code that updates my state
const hit = () => {
socket.emit('hit', roomName, function(newCard){ hit
console.log('old player hand is ' + playerHand);
var newHand = playerHand;
newHand.push(newCard);
updatePlayerHand(newHand);
console.log('new player hand is ' + playerHand); //this shows a different hand than the first print statement
});
}
//renders initial hands; seems to be working, but included in case it's relevant
socket.on('initialHands', (data) => {
updateRoomName(data.roomName);
var newHand = data.playerHand;
updatePlayerHand(newHand);
updateOpponentHand(opponentHand.concat([data.opponentFirstCard, 'back']));
updateLobbyState('started');
})
switch(lobbyState){
case 'started':
return (
<div className="lobby">
<OpponentHand opponentHand = {opponentHand}/>
<PlayerHand playerHand = {playerHand} />
{currentPlayer ? <PlayerActions
hit={hit}
stand={stand}
/> : <h1> Not your turn </h1>}
</div>
)
case 'waiting':
return (
<Waiting />
)
default:
return (
<Home
createRoom={createRoom}
joinRoom={joinRoom}
/>
)
}
PlayerHand.js
import React, {useState, useEffect} from 'react';
import cards from './exports';
function PlayerHand (props){
const [hand, updateHand] = useState([]);
useEffect(() => {
var newHand = props.playerHand;
updateHand(newHand);
}, [props.playerHand]);
return (
<div>
{hand.map((card) => (<img src={cards[card]} alt="card" className="card"/>))}
</div>
)
}
export default PlayerHand;
解决方案
尝试:
const hit = () => {
socket.emit('hit', roomName, function(newCard){ hit
console.log('old player hand is ' + playerHand);
var newHand = [ ...playerHand ]; // <----- ***** THIS *******
newHand.push(newCard);
updatePlayerHand(newHand);
console.log('new player hand is ' + playerHand); //this shows a different hand than the first print statement
});
}
当你这样做时var newHand = playerHand
,你实际上从来没有创建一个新对象,只是一个新的引用。 var newHand = [ ...playerHand ];
另一方面(双关语)确实创建了一个新对象,导致状态改变和重新渲染。
推荐阅读
- python - 正则表达式也不返回分隔模式
- python - Tkinter Image 仅显示最后一张
- php - 如何使用 PHP 从 JSON 中的数组中获取值?
- c# - ActionBlock B 从不接收 TransformBlock A 返回的项目
- java - 如何在循环中检查Java中对象的所有部分
- html - 页脚底部内容不会粘在底部
- python-3.x - 如何使用 psycopg2 将数据插入 postgres 数据库
- android - 获取列表
> 平面图操作后 - node.js - 我无法在购物车路由器中填充该项目。item 是 ItemModel 的实例
- dataweave - Dataweave 替换使用 with do