【发布时间】:2015-04-26 21:47:12
【问题描述】:
当我开始使用 React.js 冒险时,我碰壁了。我的以下时间跟踪应用的 UI 在多个级别上运行:
http://jsfiddle.net/technotarek/4n8n17tr/
效果如预期:
- 根据用户输入进行过滤
- 项目时钟可以独立启动和停止
什么不工作:
- 如果您启动一个或多个时钟然后尝试过滤,则任何不在过滤结果集中的时钟在重新显示后都会被重置。 (只需单击所有时钟上的开始,然后搜索项目,然后清除搜索输入。)
我假设发生这种情况是因为在过滤器输入的 onChange 上运行了 setState,它正在重新渲染所有内容并使用时钟 getInitialState 值。
那么,当过滤器重新渲染组件时,保留这些时钟和按钮的“状态”的正确方法是什么?我不应该将时钟或按钮“状态”存储为真正的 React 状态吗?我需要一个函数来在重新渲染之前显式保存时钟值吗?
我不要求任何人修复我的代码。相反,我希望能指出我对 React 的理解失败的地方。
为满足 SO 的代码要求,以下是包含时间跟踪器中每一行的组件。时钟通过 toggleClock 启动。 IncrementClock 写入被搜索过滤器清除的状态。请参阅上面小提琴链接中的完整代码。
var LogRow = React.createClass({
getInitialState: function() {
return {
status: false,
seconds: 0
};
},
toggleButton: function(status) {
this.setState({
status: !this.state.status
});
this.toggleClock();
},
toggleClock: function() {
var interval = '';
if(this.state.status){
// if clock is running, pause it.
clearInterval(this.interval);
} else {
// otherwise, start it
this.interval = setInterval(this.incrementClock, 1000);
}
},
incrementClock: function() {
this.setState({ seconds: this.state.seconds+1 });
},
render: function() {
var clock = <LogClock seconds={this.state.seconds} />
return (
<div>
<div className="row" key={this.props.id}>
<div className="col-xs-7"><h4>{this.props.project.title}</h4></div>
<div className="col-xs-2 text-right">{clock}</div>
<div className="col-xs-3 text-right"><TriggerButton status={this.state.status} toggleButton={this.toggleButton} /></div>
</div>
<hr />
</div>
);
}
})
【问题讨论】:
-
这就是我会做的jsfiddle.net/dhirajbodicherla/4n8n17tr/8 它不是超级高效,因为我必须赶时间。
标签: javascript reactjs