若是在react組件中設置了定製器或者在dom上綁定了事件,卸載組件時未清除定時器或未清除事件都會致使內存泄漏react
例以下面代碼:<button onClick={ReactDOM.unmountComponentAtNode.bind(this,document.getElementById('root'))}>強制卸載</button>(此方法能夠強制卸載組件)app
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;
效果圖:dom
點擊「強制卸載」,雖然組件被卸載了可是定時器和事件沒有清除致使內存泄露,此時控制檯會一直輸出。函數
解決辦法:咱們能夠利用鉤子函數:componentWillUnmount() 進行定時器和事件的清除,添加以下代碼:this
componentWillUnmount(){ //卸載組件前執行的鉤子函數 this.refs.btn.onclick = null; //清除dom上綁定的事件 clearInterval(this.timer); //清除定時器 }