Can't perform a React state update on an unmounted component. This is a no-op...... 複製代碼
程序的運行須要內存。只要程序提出要求,操做系統或者運行時(runtime)就必須供給內存。javascript
對於持續運行的服務進程(daemon),必須及時釋放再也不用到的內存。不然,內存佔用愈來愈高,輕則影響系統性能,重則致使進程崩潰。html
再也不用到的內存,沒有及時釋放,就叫作內存泄漏(memory leak)。java
function leaks(){
leak = '***'; //leak 成爲一個全局變量,不會被回收
}
複製代碼
var leaks = (function(){
var leak = '***';// 被閉包所引用,不會被回收
return function(){
console.log(leak);
}
})()
複製代碼
document.querySelector("#demo").addEventListener('click', myFunction);
var para1=document.querySelector("#demo");
para1.parentNode.removeChild(para1);
複製代碼
若是咱們在沒有取消 click 方法前去銷燬了 para1 節點,就會形成內存泄露。react
正確的作法:promise
document.querySelector("#demo").addEventListener('click', myFunction);
// 咱們須要在刪除節點前清除掛載的 click 方法
document.querySelector("#demo").removeEventListener("click", myFunction);
var para1=document.querySelector("p1");
para1.parentNode.removeChild(para1);
複製代碼
componentWillMount: function () {
var onLogin = this.props.onLogin || function () {},
onLogout = this.props.onLogout || function () {};
this.on('authChange', function () {
console.log('user authenticated:', this.state.isAuthenticated);
return this.state.isAuthenticated
? onLogin(this.state)
: onLogout(this.state);
}.bind(this));
},
複製代碼
componentWillMount
的時候掛載了authChange
事件,而後 react 出現了以下的報錯:componentWillUnmount: function () {
this.off('authChange', this.authChange);
this.authChange = null;
}
複製代碼
很明顯這種狀況就是在 dom 結構銷燬的時候,事件卻沒有清除致使的內存泄漏,因此咱們須要在
componentWillUnmount
的時候去清除掛載的方法bash
這裏就提到了內存泄露,當咱們在使用事件綁定,setInterval,setTimeOut 或一些函數的時候,可是卻沒有在組件銷燬前清除的時候會形成內存泄露。這裏咱們手動的再componentWillUnmount
去清除相關的方法便可。閉包
why:app
this.pwdErrorTimer = setTimeout(() => {
this.setState({
showPwdError:false
})
}, 1000);
複製代碼
設置了一個timer延遲設置state,然而在延遲的這段時間,組件已經銷燬,則形成此類問題async
componentWillUnmount(){
clearTimeout(this.pwdErrorTimer);
clearTimeout(this.userNameErrorTimer);
}
複製代碼
文檔中提到了兩個重要的概念
爲何要在 effect 中返回一個函數?
React 什麼時候清除 effect?
提示
若是你熟悉 React class 的生命週期函數,你能夠把 useEffect Hook 看作 componentDidMount,componentDidUpdate 和 componentWillUnmount 這三個函數的組合。