设置初始状态请记住我们传递的道具是{ 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;
}
}