在 setState 更新状态之前调用渲染
Render called before setState updates state
有什么方法可以确保在 setState
实际更新状态后调用 render
吗?据我所知,setState
是异步的。我尝试将 render
作为 setState
的回调,但它仍然在状态更新之前呈现。
HTML代码:
<div id="root"></div>
反应代码:
class Table extends React.Component {
constructor(props) {
super(props);
this.state = {
squares: []
};
this.create = this.create.bind(this);
}
create() {
console.log('squares before: ' + this.state.squares);
var a = [];
for (var i = 0; i < 16; i++) {
a.push(undefined);
}
i = Math.floor(Math.random() * 8);
a[i] = 2;
i = Math.floor(Math.random() * 8) + 8;
a[i] = 2;
console.log('new squares: ' + squares);
console.log('non-updated squares: ' + this.state.squares);
this.setState({
squares: a
}, console.log('updated squares: ' + this.state.squares);
}
componentWillMount() {
this.create();
}
render() {
console.log('rendering');
return (<div>
<table className="table">
<tbody>
<tr>
<td className="td"><Number number={this.state.squares[0]}/></td>
<td className="td"><Number number={this.state.squares[1]}/></td>
<td className="td"><Number number={this.state.squares[2]}/></td>
<td className="td"><Number number={this.state.squares[3]}/></td>
</tr>
<tr>
<td className="td"><Number number={this.state.squares[4]}/></td>
<td className="td"><Number number={this.state.squares[5]}/></td>
<td className="td"><Number number={this.state.squares[6]}/></td>
<td className="td"><Number number={this.state.squares[7]}/></td>
</tr>
<tr>
<td className="td"><Number number={this.state.squares[8]}/></td>
<td className="td"><Number number={this.state.squares[9]}/></td>
<td className="td"><Number number={this.state.squares[10]}/></td>
<td className="td"><Number number={this.state.squares[11]}/></td>
</tr>
<tr>
<td className="td"><Number number={this.state.squares[12]}/></td>
<td className="td"><Number number={this.state.squares[13]}/></td>
<td className="td"><Number number={this.state.squares[14]}/></td>
<td className="td"><Number number={this.state.squares[15]}/></td>
</tr>
</tbody>
</table>
</div>);
}
}
class Game extends React.Component {
newGame() {
this.refs.table.create();
}
render() {
return (<div>
<Table ref="table"/>
<button id="newGame" onClick={this.newGame.bind(this)}>New Game</button>
</div>);
}
}
基本上,这里发生的事情是 'rendering' 首先被记录,然后 'updated squares: ...' 像这样:
squares before: [undefined, 2, undefined, undefined, undefined, 2]
new squares: [undefined, undefined, 2, undefined, 2, undefined]
non-updated squares: [undefined, 2, undefined, undefined, undefined, 2]
rendering
updated squares: [undefined, undefined, 2, undefined, 2, undefined]
我尝试对 setState
render
进行回调,但是第二次渲染会在第一次渲染之后但在 setState
更新之前渲染 state
:
this.setState({
squares: a
}, this.render);
它记录了:
squares before: [undefined, 2, undefined, undefined, undefined, 2]
new squares: [undefined, undefined, 2, undefined, 2, undefined]
non-updated squares: [undefined, 2, undefined, undefined, undefined, 2]
rendering
rendering
如有任何帮助,我们将不胜感激。提前致谢!
synchronous
setState
in componentWillMount
不会触发重新渲染,而是反映初始渲染中的变化 itself.The 回调到 setState 但是在之后调用渲染方法。
如果您在渲染方法中记录 state squares
,它将在初始渲染本身中记录正确的结果。
P.S. componentWillMount
在最新版本中已弃用,最好将当前逻辑放在构造函数中而不是 componentWillMount
使用 shouldComponentUpdate(object nextProps, object nextState) 进行渲染,每次 returns 为真,渲染就会发生
有什么方法可以确保在 setState
实际更新状态后调用 render
吗?据我所知,setState
是异步的。我尝试将 render
作为 setState
的回调,但它仍然在状态更新之前呈现。
HTML代码:
<div id="root"></div>
反应代码:
class Table extends React.Component {
constructor(props) {
super(props);
this.state = {
squares: []
};
this.create = this.create.bind(this);
}
create() {
console.log('squares before: ' + this.state.squares);
var a = [];
for (var i = 0; i < 16; i++) {
a.push(undefined);
}
i = Math.floor(Math.random() * 8);
a[i] = 2;
i = Math.floor(Math.random() * 8) + 8;
a[i] = 2;
console.log('new squares: ' + squares);
console.log('non-updated squares: ' + this.state.squares);
this.setState({
squares: a
}, console.log('updated squares: ' + this.state.squares);
}
componentWillMount() {
this.create();
}
render() {
console.log('rendering');
return (<div>
<table className="table">
<tbody>
<tr>
<td className="td"><Number number={this.state.squares[0]}/></td>
<td className="td"><Number number={this.state.squares[1]}/></td>
<td className="td"><Number number={this.state.squares[2]}/></td>
<td className="td"><Number number={this.state.squares[3]}/></td>
</tr>
<tr>
<td className="td"><Number number={this.state.squares[4]}/></td>
<td className="td"><Number number={this.state.squares[5]}/></td>
<td className="td"><Number number={this.state.squares[6]}/></td>
<td className="td"><Number number={this.state.squares[7]}/></td>
</tr>
<tr>
<td className="td"><Number number={this.state.squares[8]}/></td>
<td className="td"><Number number={this.state.squares[9]}/></td>
<td className="td"><Number number={this.state.squares[10]}/></td>
<td className="td"><Number number={this.state.squares[11]}/></td>
</tr>
<tr>
<td className="td"><Number number={this.state.squares[12]}/></td>
<td className="td"><Number number={this.state.squares[13]}/></td>
<td className="td"><Number number={this.state.squares[14]}/></td>
<td className="td"><Number number={this.state.squares[15]}/></td>
</tr>
</tbody>
</table>
</div>);
}
}
class Game extends React.Component {
newGame() {
this.refs.table.create();
}
render() {
return (<div>
<Table ref="table"/>
<button id="newGame" onClick={this.newGame.bind(this)}>New Game</button>
</div>);
}
}
基本上,这里发生的事情是 'rendering' 首先被记录,然后 'updated squares: ...' 像这样:
squares before: [undefined, 2, undefined, undefined, undefined, 2]
new squares: [undefined, undefined, 2, undefined, 2, undefined]
non-updated squares: [undefined, 2, undefined, undefined, undefined, 2]
rendering
updated squares: [undefined, undefined, 2, undefined, 2, undefined]
我尝试对 setState
render
进行回调,但是第二次渲染会在第一次渲染之后但在 setState
更新之前渲染 state
:
this.setState({
squares: a
}, this.render);
它记录了:
squares before: [undefined, 2, undefined, undefined, undefined, 2]
new squares: [undefined, undefined, 2, undefined, 2, undefined]
non-updated squares: [undefined, 2, undefined, undefined, undefined, 2]
rendering
rendering
如有任何帮助,我们将不胜感激。提前致谢!
synchronous
setState
in componentWillMount
不会触发重新渲染,而是反映初始渲染中的变化 itself.The 回调到 setState 但是在之后调用渲染方法。
如果您在渲染方法中记录 state squares
,它将在初始渲染本身中记录正确的结果。
P.S. componentWillMount
在最新版本中已弃用,最好将当前逻辑放在构造函数中而不是 componentWillMount
使用 shouldComponentUpdate(object nextProps, object nextState) 进行渲染,每次 returns 为真,渲染就会发生