若是在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); //清除定时器 }