是否可以在 React 的静态 getDerivedStateFromPROps 方法中使用 ClearInterval?
Is it possible to use ClearInterval inside static getDerivedStateFromPRops method in React?
我设置了一个 Interval 并在 ComponentDidMount 方法中做了一些操作。我想在 props.status 完成后清除 Interval。
class A extends React.PureComponent {
constructor(props) {
super(props);
this.intervalTimer = '';
}
componentDidMount() {
this.intervalTimer = setTimeout(() => {
// do something;
}, 3000);
}
static getDerivedStateFromProps(np, ps) {
if(np.status === 'completed') {
clearInterval(A.intervalTimer);
}
}
}
您可以创建静态变量并在 getDerivedStateFromProps
生命周期方法中使用它。
这里intervalTimer
是静态方法内部可以访问的变量
这是工作代码:-
import React from "react";
import ReactDOM from "react-dom";
let intervalTimer = "";
class App extends React.PureComponent {
state = {
stop: false
};
componentDidMount() {
intervalTimer = setInterval(() => {
console.log("interval going on");
}, 3000);
}
handleClick = () => {
this.setState({ stop: true });
};
static getDerivedStateFromProps(props, state) {
if (state.stop) {
clearInterval(intervalTimer);
}
return null;
}
render() {
return (
<div>
<button onClick={this.handleClick}>Stop interval</button>
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
或者你也可以使用静态变量而不是全局变量
static intervalTimer = ''
componentDidMount() {
App.intervalTimer = setInterval(() => {
console.log("interval going on");
}, 3000);
}
static getDerivedStateFromProps(props, state) {
if (state.stop) {
clearInterval(App.intervalTimer);
}
return null;
}
这两种方法都可以正常工作。
希望对您有所帮助!!!
您不应允许 getDerivedStateFromProps 更改 none 静态变量或调用 none 静态方法。最好从那里 return 新状态。我的建议是使用不同的生命周期方法,例如
componentDidUpdate(prevProps) {
// compare status props and clear timer
if (this.props.status === 'completed') {
clearInterval(this.intervalTimer);
}
}
保险起见也把里面清理一下
componentWillUnmount(){
clearInterval(this.intervalTimer)
}
我设置了一个 Interval 并在 ComponentDidMount 方法中做了一些操作。我想在 props.status 完成后清除 Interval。
class A extends React.PureComponent {
constructor(props) {
super(props);
this.intervalTimer = '';
}
componentDidMount() {
this.intervalTimer = setTimeout(() => {
// do something;
}, 3000);
}
static getDerivedStateFromProps(np, ps) {
if(np.status === 'completed') {
clearInterval(A.intervalTimer);
}
}
}
您可以创建静态变量并在 getDerivedStateFromProps
生命周期方法中使用它。
这里intervalTimer
是静态方法内部可以访问的变量
这是工作代码:-
import React from "react";
import ReactDOM from "react-dom";
let intervalTimer = "";
class App extends React.PureComponent {
state = {
stop: false
};
componentDidMount() {
intervalTimer = setInterval(() => {
console.log("interval going on");
}, 3000);
}
handleClick = () => {
this.setState({ stop: true });
};
static getDerivedStateFromProps(props, state) {
if (state.stop) {
clearInterval(intervalTimer);
}
return null;
}
render() {
return (
<div>
<button onClick={this.handleClick}>Stop interval</button>
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
或者你也可以使用静态变量而不是全局变量
static intervalTimer = ''
componentDidMount() {
App.intervalTimer = setInterval(() => {
console.log("interval going on");
}, 3000);
}
static getDerivedStateFromProps(props, state) {
if (state.stop) {
clearInterval(App.intervalTimer);
}
return null;
}
这两种方法都可以正常工作。
希望对您有所帮助!!!
您不应允许 getDerivedStateFromProps 更改 none 静态变量或调用 none 静态方法。最好从那里 return 新状态。我的建议是使用不同的生命周期方法,例如
componentDidUpdate(prevProps) {
// compare status props and clear timer
if (this.props.status === 'completed') {
clearInterval(this.intervalTimer);
}
}
保险起见也把里面清理一下
componentWillUnmount(){
clearInterval(this.intervalTimer)
}