我对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
},()=>{
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,()=>{
afterSetCountFinished();
});