[英]How do I change the properties of an object in state?
我已经使用React框架工作了两个星期,但是我经常为新事物感到惊讶。 我正在为团体项目制作游戏的登录/游戏大厅/服务器大厅。
我对目前的状态有些困惑。 到目前为止,要更改我的状态,我一直在使用:
setState({stateProperty: newValue});
我感到困惑的原因是我有一个状态数组,其中包含一个元素列表。 每个元素都是屏幕上显示的一行,我需要更改此元素中的单词之一。 该元素必须由网站的所有查看者看到,因此这些行必须保持在状态中。
问题在于该词是该元素的属性。 为了能够设置状态,我需要传递此元素的新版本,但是我不能这样做,因为我需要使用不同的属性来制作此元素的版本...我无法更改属性。
看来我必须更改状态或其他状态? 我将如何去做呢?
数组的属性以这种方式推送,其中我试图更改“ GameLine”对象的“状态”,而“ GameLine”是数组“ children”中的元素之一:
children.push(
<GameLine
players={allPlayers}
lobbyStateChange={this.lobbyStateChange.bind(this)}
joinState={this.joinState.bind(this)}
joinAppears={this.joinAppears.bind(this)}
handleLobbyChange={this.handleLobbyChange.bind(this)}
lobby={newLobbyName}
owner={owner}
type={newGameType}
difficulty={newDifficulty}
status={newStatus}
number={gamesAmount}
key={"gameLineKey"+owner}
className="gamesGames"
/>
);
抱歉,这是一个不好的问题! 我在这里先向您的帮助表示感谢!
Severiaan的答案正是我想要的! 非常感谢!
重申一下我的问题,对于以后的读者:
这是我程序的初始状态:
this.state = {
inLogin: true,
inGameLobby: false,
inLobbyCreate: false,
currentGame: 0,
message: "",
allMessages: [],
messageAmount: 0,
games: 0,
allGameLines: [],
allGames: [],
lobbyName: "",
owner: "",
gameType: "",
difficulty: "",
status: "",
user: "",
allUsers: [],
userAmount: 0,
selectedGame: "",
buttonVisibility: "hidden",
username: "",
role: "",
currentTab: "logTab",
allLobbies: [],
allLobbyPlayers: [],
playersReady: [],
allGameLobbyMessages: [],
}
在我的网页上,每次有人创建“游戏大厅”时,都会创建一个“ gameLine”,其他玩家可以单击该行以加入该大厅。 “ gameLine”将大厅中的玩家数量显示为“状态”。 我不确定如何更改“ gameLine”的此属性。
状态属性“ allGameLines”是“ gameLine”元素的列表,当有人加入或加入该元素时,该元素(很复杂,不需要显示所有代码,不需要了解问题)将被重新呈现。离开大厅。
问题是'gameLine'元素具有自己的属性。 通常,在编辑状态时,可以使用以下命令:
setState({
allGameLines: newAllGameLines,
});
在这种情况下,不能使用'setState',因为我们不能创建新版本'newAllGameLines',因为要创建新版本,我们需要更改属性'status'。
“ Lukasz'seVeriaan'Grela”拥有进入“ allGameLines”并直接更改“状态”的完美解决方案。 解决方案如下所示:
lobbyStateChange(newGameStatus, allLobbyPlayers, jTerm){
this.setState(prevState =>({
inGameLobby: true,
buttonVisibility: "hidden",
allLobbyPlayers,
allGameLines: {
...prevState.allGameLines,
jTerm: {
props: {
status: newGameStatus,
}
}
},
}));
}
谢谢大家的帮助!
您可以细粒度地更改状态,您必须复制未修改的状态,例如
this.state ={ prop1:”abc”,
prop2:{
Sub1:”abc1”,
Sub2:”def2”
}:
this.setState(prevState=>({
prop2:{
...prevState.prop2,
Sub2:”changed”
}
});
这只会更改sub2。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.