如果setInterval
不等于this.props.firebase
,如何取消null
?
VerifyEmail = () => {
const { firebase } = this.props;
console.log(firebase);
if (firebase !== null) {
this.setState({ validCode: true, verifiedCode: true });
}
};
componentDidMount() {
const { firebase } = this.props;
if (firebase === null) {
this.intervalID = setInterval(() => this.VerifyEmail(), 1000);
} else if (firebase !== null) {
clearInterval(this.intervalID);
}
}
componentWillUnmount() {
clearInterval(this.intervalID);
}
当前,重复执行this.VerifyEmail
,并且如果clearInterval
不等于this.props.firebase
的情况下我尝试进行null
的尝试。
此外,如果您有另一种方法可以在页面呈现时自动this.VerifyEmail()
,并且this.props.firebase
不等于null
。请提出建议。
答案 0 :(得分:1)
componentDidMount
(或简称为cDM
)在安装组件时仅运行一次。稍后,如果您未更改props
,则将其调用。 props
更改后,将运行componentDidUpdate
。您可以将支票放在这里,牢记检查prevProps.firebase !== this.props.firebase
,也可以堆叠无休止的重新渲染。就是这样
componentDidUpdate(prevProps) {
const { firebase: prevFirebase } = this.prevProps;
const { firebase } = this.props;
if (!prevFirebase && firebase) { // null => not-null
this.intervalID = setInterval(() => this.VerifyEmail(), 1000);
}
if (prevFirebase && !firebase) { // not-null => null
clearInterval(this.intervalID);
}
}
不要错过在componentDidMount
(对于最初提供props.firebase
的情况)和componentDidUpdate
(对于props.firebase
最初是{{的情况下) 1}}和更高版本分配给null
)。
但是我相信可能会有更多的DRY解决方案。在提取数据之前,您是否真的需要渲染此组件?您是否渲染一些占位符,直到出现props
并加载数据?如果是,那么如何将数据加载到父组件?然后,您的组件将通过firebase
检索数据,它的渲染可能像props