【发布时间】:2014-11-17 18:22:32
【问题描述】:
我一直在尝试通过编写一个小型计算器应用程序来学习 React.js。我认为事情进展顺利,直到我了解到 setState 是异步的,因此我的突变不会立即应用。
所以我的问题是,根据添加到输入的值来保持运行总计的最佳方法是什么。举个例子:
var Calculator = React.createClass({
total : 0,
getInitialState : function(){
return {
value : '0'
};
},
onValueClicked : function (value) {
var actual, total, current = this.state.value;
if(value === '+') {
actual = this.total = parseInt(this.total, 10) + parseInt(current, 10);
} else {
if(parseInt(current, 10) === 0) {
actual = value;
} else {
actual = current.toString() + value;
}
}
this.setState({ value : actual });
},
render : function () {
return (
<div className="calc-main">
<CalcDisplay value={this.state.value} />
<CalcButtonGroup range="0-10" onClick={this.onValueClicked} />
<CalcOpButton type="+" onClick={this.onValueClicked} />
</div>
)
}
});
var CalcDisplay = React.createClass({
render : function () {
return (
<input type="text" name="display" value={this.props.value} />
);
}
});
var CalcButtonGroup = React.createClass({
render : function () {
var i, buttons = [], range = this.props.range.split('-');
for(i = range[0]; i < range[1]; i++) {
var handler = this.props.onClick.bind(null, i);
buttons.push(<CalcNumberButton key={i} onClick={ handler } />);
}
return (
<div className="calc-btn-group">{ buttons }</div>
);
}
});
var CalcNumberButton = React.createClass({
render : function () {
return (
<button onClick={this.props.onClick}>{this.props.key}</button>
);
}
});
var CalcOpButton = React.createClass({
render : function () {
var handler, op = this.props.type;
handler = this.props.onClick.bind(null, op);
return (
<button onClick={handler}>{op}</button>
);
}
});
React.renderComponent(<Calculator />, document.getElementById('container'));
在上面的示例中,我完全放弃了将总数存储在状态中并将其保留在外部。我读过你可以在 setState 完成后运行回调,但对于计算器,我需要它快速更新。如果每次按下按钮时状态都没有更新并且我快速按下按钮 - 事情将会不同步。回调是我所缺少的,还是我以完全错误的方式思考这个问题?
任何帮助表示赞赏!
【问题讨论】:
-
老实说,如果您根本不需要在
render函数中使用this.total,那么将其保持在状态之外就很好了。仅当对它的任何更改always导致重新渲染时,东西才需要处于状态。如果您实际上不需要在更改 this.total 时始终重新渲染,那么您可以保持原样。 -
如果我没记错的话,在当前的实现中,如果你调用
setState来响应一个事件,状态将在任何进一步的事件被调度之前解决。 -
我认为这里的部分问题是我在控制台记录状态值。但是我发现,如果我尝试在状态中存储多个项目并在一个地方更改一个字段并在其他地方更改另一个字段 - 这两个值将不同步。即,如果我将操作数存储在状态中并在下一次交互中检查它的存在 - 它不会总是被设置。
标签: javascript reactjs