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检测内存泄漏?

避免实体框架查询返回的列表中的内存泄漏

在静态方法中调用 new Runnable() 是不是可以避免内存泄漏?

内存泄漏解决方式

内存泄漏的场景分析和避免方法总结,C语言内存泄漏详解!