从 React 中的状态借用 属性 的值
Borrowing a property's value from state in React
我不知道我的措辞是否正确,请耐心等待。基本上,我有一个组件是一个功能计数器(增量或减量)。另一个组件是一个计时器,它从(默认)25 倒数到 0。
以前,我只是将计时器的值设置为 25,但我试图让 计时器随着计数器值的变化而变化,并且当使用按下 "start" 按钮,计时器将从计数器设置的数字开始倒计时。
我可以让组件单独工作,但不能一起工作。
我试过将 this.state.currentCount
设置为 this.props.time
的值,然后更改 this.state.currentCount
的值,但没有成功。要么计时器不动,要么它不反映计数器的值。
不确定我是否应该使用 componentWillReceiveProps
。
如有任何帮助,我们将不胜感激。如果有帮助,底部有截图。
会话组件:
const Session = React.createClass({
getInitialState: function() {
return {
minutes: 25,
seconds: 0
};
},
increment: function() {
this.setState({ minutes: this.state.minutes + 1 });
},
decrement: function() {
this.setState({ minutes: this.state.minutes - 1 });
},
timeToString: function(time) {
return time + ':00';
},
render: function() {
return (
<section>
<button onClick={this.increment}>+</button>
<button onClick={this.decrement}>-</button>
{this.state.minutes}
<Clock time={this.state.minutes}/>
</section>
);
}
});
module.exports = Session;
时钟组件:
const Clock = React.createClass({
getInitialState: function() {
return { currentCount: this.props.time };
},
startTimer: function() {
var intervalId = setInterval(this.timer, 1000);
this.setState({ intervalId: intervalId });
},
pauseTimer: function() {
clearInterval(this.state.intervalId);
this.setState({ intervalId: this.props.time });
},
timer: function() {
var newCount = this.state.currentCount - 1;
if (newCount >= 0) {
this.setState({ currentCount: newCount });
} else {
clearInterval(this.state.intervalId);
}
},
render: function() {
return (
<section>
<button onClick={this.startTimer}>Start</button>
<button onClick={this.pauseTimer}>Pause</button>
{this.props.time}
<br></br>
{this.state.currentCount}
</section>
);
}
});
module.exports = Clock;
getInitialState
只有 运行s 当组件第一次初始化时等等
从父组件更新它不会 运行 该功能。你是对的
因为您想使用生命周期事件之一,在这种情况下
componentWillReceiveProps
听起来最合适,因为你可以
setState
在那里,你不需要等待组件渲染(否则
你会使用 componentDidUpdate
)。
我还没有检查过这段代码,但我认为它应该与这个添加一起工作:
const Clock = React.createClass({
...
componentWillReceiveProps: function(nextProps) {
// Perhaps pause timer here as well?
this.setState({
currentCount: nextProps.time
})
},
...
});
因为您的计时器取决于 Start
按钮。如果在 startTimer
方法中设置 currentCount
的状态就好了。
startTimer: function() {
if(this.state.intervalId)
clearInterval(this.state.intervalId); //clear the running interval
this.setState({ currentCount: this.props.time }); // reset currentcount
var intervalId = setInterval(this.timer, 1000);
this.setState({ intervalId: intervalId });
},
我不知道我的措辞是否正确,请耐心等待。基本上,我有一个组件是一个功能计数器(增量或减量)。另一个组件是一个计时器,它从(默认)25 倒数到 0。
以前,我只是将计时器的值设置为 25,但我试图让 计时器随着计数器值的变化而变化,并且当使用按下 "start" 按钮,计时器将从计数器设置的数字开始倒计时。
我可以让组件单独工作,但不能一起工作。
我试过将 this.state.currentCount
设置为 this.props.time
的值,然后更改 this.state.currentCount
的值,但没有成功。要么计时器不动,要么它不反映计数器的值。
不确定我是否应该使用 componentWillReceiveProps
。
如有任何帮助,我们将不胜感激。如果有帮助,底部有截图。
会话组件:
const Session = React.createClass({
getInitialState: function() {
return {
minutes: 25,
seconds: 0
};
},
increment: function() {
this.setState({ minutes: this.state.minutes + 1 });
},
decrement: function() {
this.setState({ minutes: this.state.minutes - 1 });
},
timeToString: function(time) {
return time + ':00';
},
render: function() {
return (
<section>
<button onClick={this.increment}>+</button>
<button onClick={this.decrement}>-</button>
{this.state.minutes}
<Clock time={this.state.minutes}/>
</section>
);
}
});
module.exports = Session;
时钟组件:
const Clock = React.createClass({
getInitialState: function() {
return { currentCount: this.props.time };
},
startTimer: function() {
var intervalId = setInterval(this.timer, 1000);
this.setState({ intervalId: intervalId });
},
pauseTimer: function() {
clearInterval(this.state.intervalId);
this.setState({ intervalId: this.props.time });
},
timer: function() {
var newCount = this.state.currentCount - 1;
if (newCount >= 0) {
this.setState({ currentCount: newCount });
} else {
clearInterval(this.state.intervalId);
}
},
render: function() {
return (
<section>
<button onClick={this.startTimer}>Start</button>
<button onClick={this.pauseTimer}>Pause</button>
{this.props.time}
<br></br>
{this.state.currentCount}
</section>
);
}
});
module.exports = Clock;
getInitialState
只有 运行s 当组件第一次初始化时等等
从父组件更新它不会 运行 该功能。你是对的
因为您想使用生命周期事件之一,在这种情况下
componentWillReceiveProps
听起来最合适,因为你可以
setState
在那里,你不需要等待组件渲染(否则
你会使用 componentDidUpdate
)。
我还没有检查过这段代码,但我认为它应该与这个添加一起工作:
const Clock = React.createClass({
...
componentWillReceiveProps: function(nextProps) {
// Perhaps pause timer here as well?
this.setState({
currentCount: nextProps.time
})
},
...
});
因为您的计时器取决于 Start
按钮。如果在 startTimer
方法中设置 currentCount
的状态就好了。
startTimer: function() {
if(this.state.intervalId)
clearInterval(this.state.intervalId); //clear the running interval
this.setState({ currentCount: this.props.time }); // reset currentcount
var intervalId = setInterval(this.timer, 1000);
this.setState({ intervalId: intervalId });
},