react中避免内存泄漏的方法

若是在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);      //清除定时器
}
相关文章
相关标签/搜索