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);      //清除定時器
}
相關文章
相關標籤/搜索