setState完成更新后,我可以执行函数吗?

我对ReactJS非常陌生(比如,今天才开始)。我不太明白setState是如何工作的。我将React和easeljs结合起来,根据用户输入绘制一个网格。这是我的JS邮箱:
http://jsbin.com/zatula/edit?js,输出

代码如下:

var阶段;
var Grid=React.createClass({
getInitialState:函数(){
返回{
行:10,
科尔斯:10
}
},
componentDidMount:函数(){
这个.drawGrid();
},
drawGrid:function(){
stage=newcreatejs.stage(“画布”);
var矩形=[];
var矩形;
//排
对于(var x=0;x<this.state.rows;x++)
{
//纵队
对于(变量y=0;y<this.state.cols;y++)
{
变量颜色=“绿色”;;
矩形=新建createjs.Shape();
矩形.graphics.beginll(颜色);
矩形.graphics.drawRect(0,0,32,44);
矩形x=x*33;
矩形y=y*45;
stage.addChild(矩形);
变量id=矩形.x+“uquot;+矩形.y”;
矩形[id]=矩形;
}
}
stage.update();
},
updateEnumRows:函数(事件){
this.setState({rows:event.target.value});
这个.drawGrid();
},
updateNumCols:函数(事件){
this.setState({cols:event.target.value});
这个.drawGrid();
},
render:function(){
返回(
<div>
<div className="画布包装器">
<canvas id=“canvas”width=“400”height=“500”gt;lt;/canvas>
<p>行:{this.state.Rows}</p>
<p>列:{this.state.cols}</p>
</div>
<div className=“数组形式”;
<表格>
<label>行数</label>
<select id="numRows"value={this.state.rows}onChange={this.updateNumRows}>
<期权价值="1>1</option>
<期权价值="2>2</option>
<期权价值="5>5</option>
<期权价值="10"gt;10</option>
<期权价值="12>12</option>
<期权价值="15"gt;15</option>
<期权价值="20"20</option>
</select>
<label>列数</label>
<select id="numCols"value={this.state.cols}onChange={this.updateNumCols}>
<期权价值="1>1</option>
<期权价值="2>2</option>
<期权价值="5>5</option>
<期权价值="10"gt;10</option>
<期权价值="12>12</option>
<期权价值="15"gt;15</option>
<期权价值="20"20</option>
</select>
</form>
</div>
</div>
);
}
});
ReactDOM.render(
<网格/>,
document.getElementById(“容器”)
);

您可以在JSbin中看到,当您使用其中一个下拉菜单更改行数或列数时,第一次不会发生任何事情。下次更改下拉列表值时,网格将绘制到上一个状态的行和列值。我猜这是因为我的this.drawGrid()函数在setState完成之前执行。也许还有别的原因

谢谢你的时间和帮助

setState(更新程序[,回调])是一个异步函数:

https://facebook.github.io/react/docs/react-component.html#setstate

您可以在setState完成后使用第二个参数回调执行函数,如:

this.setState({
某个州:obj
},()=&gt{
this.afterSetStateFinished();
});

在React功能组件中也可以使用钩子执行相同的操作:

https://github.com/the-road-to-learn-react/use-state-with-callback#usage

查看useStateWithCallbackLazy:

从'use state with callback'导入{useStateWithCallbackLazy};
const[count,setCount]=useStateWithCallbackLazy(0);
设置计数(计数+1,()=&gt{
afterSetCountFinished();
});

发表评论