javascript - 对于这个特定的示例,我将如何使用 setState?
问题描述
我在控制台中收到警告,上面写着:
Do not mutate state directly. Use setState() react/no-direct-mutation-state
因为this.state.turn = this.state.turn === 'X' ? 'O' : 'X';
我将它更改为this.setState({turn: 'X' ? 'O' : 'X'});
确实消除了警告但我这样做,我的程序没有按照它应该的方式执行,这让我相信我做错了。
因为this.state.totalMoves++;
我将其更改为,this.setState({totalMoves: this.state.totalMoves++});
但我仍然收到该警告。
实现这一目标的正确方法是什么?
这是我的代码:
constructor(props) {
super(props);
this.state = {
turn: 'X',
board: Array(9).fill(''),
totalMoves: 0
}
}
if(this.state.board[box.dataset.square] === '') {
// was previously this.state.board[box.dataset.square] = this.state.turn
this.setState({turn: this.state.board[box.dataset.square]});
box.innerText = this.state.turn;
this.state.turn = this.state.turn === 'X' ? 'O' : 'X';
this.state.totalMoves++;
}
解决方案
Firstly
setState 是异步的,因此 setState 的更新不会立即反映,您可以使用 setState 回调在状态更新后执行某些操作
this.setState(state => {
box.innerText = state.turn;
return { turn: state.board[box.dataset.square]}
});
Secondly
, setState 提供了一个函数回调方法来根据之前的状态更新状态
在你的情况下,你会这样写
this.setState(prevState => ({
turn: prevState.turn === 'X' ? 'O' : 'X',
totalMoves: prevState.totalMoves + 1
});
推荐阅读
- python - 如何从字典中删除方括号
- c# - LINQ to Entities 无法识别方法“System.String ToString()”方法 ++++++
- java - 如何使用键作为字符串读取多维 HashMap
- swift - 查看模型组合打破了 mvvm 结构
- qliksense - 数据透视表,每列都从其中扣除前列值
- python-3.x - 如何链接散景布局中所有绘图的轴?
- node.js - 更改 GruntFile 不会更改 livereload 端口
- java - Solr ClassCastException 与自定义 TokenFilterFactory
- android - 如何以编程方式从 android 设备导入和读取随机 SQLITE 数据库文件 (.db)?
- java - 如何在 Jmeter 中发送 http 表单