设置初始状态记住我们传递的props是{ name:'alice' }
. 但是为了getDerivedStateFromProps
能够查看名称是否更改,我们必须将其镜像到我们的状态并使用prevState.name
. 我们不能this
在生命周期方法内部使用,因为它getDerivedStateFromProps
是pure
。
state = {time: 0, endtime: 0, name:'' }
当组件安装时,将时钟设置为每秒递增 1。
componentDidMount() {
this.setClock();
}
组件卸载时 clearInterval
componentWillUnmount() {
clearInterval(this.clockCall)
}
setInterval
将incrementClock
每秒调用一次,每 1000 毫秒(1 秒)将计时器增加 1。
setClock = () => {
this.setState({time: 0})
this.clockCall = setInterval(() => {
this.incrementClock();
}, 1000)
}
这是我们设置时间状态并每秒递增的地方。
incrementClock = () => {
this.setState((prevstate) => {time: prevstate.time + 1 })
}
如果名称更改,我们将时间保存在一个名为的新状态块中endtime
,这就是我们用来显示的内容,hey alice its been ${this.state.endtime} seconds
我们还将计时器重置为 0。
static getDerivedStateFromProps(nextProps, prevState) {
if(prevState.name !== nextProps.name)
return { time: 0, endtime:prevState.time };
return null;
}
这里是你将如何使用这两个例子getDerivedStateFromProps
相比,componentWillRecieveProps
前
class ExampleComponent extends React.Component {
state = {
derivedData: computeDerivedState(this.props)
};
componentWillReceiveProps(nextProps) {
if (this.props.someValue !== nextProps.someValue) {
this.setState({
derivedData: computeDerivedState(nextProps)
});
}
}
}
后
class ExampleComponent extends React.Component {
// Initialize state in constructor,
// Or with a property initializer.
state = {};
static getDerivedStateFromProps(nextProps, prevState) {
if (prevState.someMirroredValue !== nextProps.someValue) {
return {
derivedData: computeDerivedState(nextProps),
someMirroredValue: nextProps.someValue
};
}
// Return null to indicate no change to state.
return null;
}
}