Tôi rất mới với React JS (như trong, mới bắt đầu hôm nay). Tôi hoàn toàn không hiểu cách setState hoạt động. Tôi đang kết hợp React và Easel JS để vẽ lưới dựa trên đầu vào của người dùng. Đây là thùng JS của tôi: http://jsbin.com/zatula/edit?js,output
Đây là mã:
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")
);
Bạn có thể thấy trong thùng JS khi bạn thay đổi số lượng hàng hoặc cột bằng một trong những lần thả xuống, sẽ không có gì xảy ra lần đầu tiên. Lần tới khi bạn thay đổi giá trị thả xuống, lưới sẽ rút về các giá trị hàng và cột của trạng thái trước đó. Tôi đoán điều này đang xảy ra vì hàm this.drawGrid () của tôi đang thực thi trước khi setState hoàn tất. Có lẽ có một lý do khác?
Xin cám ơn về thời gian và sự giúp đỡ của bạn!