如果在react組件中設置了定制器或者在dom上綁定了事件,卸載組件時未清除定時器或未清除事件都會導致內存泄漏
例如下面代碼:<button onClick={ReactDOM.unmountComponentAtNode.bind(this,document.getElementById('root'))}>強制卸載</button>(此方法可以強制卸載組件)
import React,{Component} from 'react'
import ReactDOM from 'react-dom'
class App extends Component{
constructor(props){
super(props);
this.state={
opa:0
}
}
componentDidMount(){ //組件掛載完成后執行的鈎子函數
this.refs.btn.onclick=()=>{ //給dom綁定事件
alert('btn');
}
var opa = this.state.opa;
this.timer = setInterval(()=>{ //設置定時器
console.log(opa); //如果卸載組件時沒有清除定時器就會一直輸出
opa+=0.1;
if(opa >= 1){
opa = 0;
}
this.setState({
opa
})
}, 300);
}
render(){
return (<div className='app'>
<h1 style={{opacity:this.state.opa}}>HELLO WORLD</h1>
<button onClick={ReactDOM.unmountComponentAtNode.bind(this,document.getElementById('root'))}>強制卸載</button>
<button ref="btn">彈出</button>
</div>)
}
}
export default App;
效果圖:

點擊“強制卸載”,雖然組件被卸載了但是定時器和事件沒有清除導致內存泄露,此時控制台會一直輸出。
解決辦法:我們可以利用鈎子函數:componentWillUnmount() 進行定時器和事件的清除,添加如下代碼:
componentWillUnmount(){ //卸載組件前執行的鈎子函數
this.refs.btn.onclick = null; //清除dom上綁定的事件
clearInterval(this.timer); //清除定時器
}
