react中避免内存泄漏的方法
Posted luowenshuai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了react中避免内存泄漏的方法相关的知识,希望对你有一定的参考价值。
如果在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); //清除定时器 }
以上是关于react中避免内存泄漏的方法的主要内容,如果未能解决你的问题,请参考以下文章
如何使用模块化代码片段中的LeakCanary检测内存泄漏?