我对React JS非常陌生(例如,从今天开始)。我不太了解setState的工作方式。我将React和Easel JS结合起来,根据用户输入绘制网格。这是我的JS bin:http://jsbin.com/zatula/edit? js,输出
这是代码:
var stage; var Grid = React.createClass({ getInitialState: function() { return { rows: 10, cols: 10 } }, componentDidMount: function () { this.drawGrid(); }, drawGrid: function() { stage = new createjs.Stage("canvas"); var rectangles = []; var rectangle; //Rows for (var x = 0; x < this.state.rows; x++) { // Columns for (var y = 0; y < this.state.cols; y++) { var color = "Green"; rectangle = new createjs.Shape(); rectangle.graphics.beginFill(color); rectangle.graphics.drawRect(0, 0, 32, 44); rectangle.x = x * 33; rectangle.y = y * 45; stage.addChild(rectangle); var id = rectangle.x + "_" + rectangle.y; rectangles[id] = rectangle; } } stage.update(); }, updateNumRows: function(event) { this.setState({ rows: event.target.value }); this.drawGrid(); }, updateNumCols: function(event) { this.setState({ cols: event.target.value }); this.drawGrid(); }, render: function() { return ( <div> <div className="canvas-wrapper"> <canvas id="canvas" width="400" height="500"></canvas> <p>Rows: { this.state.rows }</p> <p>Columns: {this.state.cols }</p> </div> <div className="array-form"> <form> <label>Number of Rows</label> <select id="numRows" value={this.state.rows} onChange={ this.updateNumRows }> <option value="1">1</option> <option value="2">2</option> <option value ="5">5</option> <option value="10">10</option> <option value="12">12</option> <option value="15">15</option> <option value="20">20</option> </select> <label>Number of Columns</label> <select id="numCols" value={this.state.cols} onChange={ this.updateNumCols }> <option value="1">1</option> <option value="2">2</option> <option value="5">5</option> <option value="10">10</option> <option value="12">12</option> <option value="15">15</option> <option value="20">20</option> </select> </form> </div> </div> ); } }); ReactDOM.render( <Grid />, document.getElementById("container") );
当您使用下拉菜单之一更改行数或列数时,您会在JS bin中看到,第一次不会发生任何事情。下次更改下拉值时,网格将绘制到先前状态的行和列值。我猜这是因为我的this.drawGrid()函数在setState完成之前正在执行。也许还有另一个原因?
感谢您的时间和帮助!
setState(updater[, callback]) 是一个异步函数:
setState(updater[, callback])
https://facebook.github.io/react/docs/react- component.html#setstate
您可以在setState完成后使用第二个参数执行函数,callback如下所示:
callback
this.setState({ someState: obj }, () => { this.afterSetStateFinished(); });