反应内存泄漏FAQ解决方案

发布者:上海IT外包来源:http://www.lanmon.net点击数:835

程序的操作需要内存。只要程序请求,操作系统或运行时必须提供内存。不再使用但未及时释放的内存称为内存泄漏。
什么是内存泄漏?
程序的操作需要内存。只要程序请求,操作系统或运行时必须提供内存。
对于连续运行的服务守护程序,您必须释放不再需要的内存。否则,内存使用量会越来越高,这会影响系统性能并导致进程崩溃。
不再使用但未及时释放的内存称为内存泄漏。
JavaScript中常见的几个内存泄漏
全局变量导致内存泄漏
提供商泄密(){
泄漏='***'; //泄漏成为全局变量,不会被回收
}
关闭导致内存泄漏
Var leaks=(function(){
Var leak='***'; //由闭包引用,不会被回收
返回函数(){
CONSOLE.LOG(泄漏);
}
})()
清空dom时清除事件导致的内存泄漏
document.querySelector('#demo')。addEventListener('click',myFunction);
Var para1=document.querySelector('#demo');
para1.parentNode.removeChild(PARA1);
如果我们在取消click方法之前销毁para1节点,它将导致内存泄漏。
正确的方法:
document.querySelector('#demo')。addEventListener('click',myFunction);
//我们需要在删除节点之前清除已挂载的click方法
document.querySelector('#demo')。removeEventListener('click',myFunction);
Var para1=document.querySelector('p1');para1.parentNode.removeChild(PARA1);
具体的例子
1.演示1:
componentWillMount: function(){
Var onLogin=this.props.onLogin || function(){},
onLogout=this.props.onLogout || function(){};
This.on('authChange',function(){
Console.log('用户认证:',this.state.isAuthenticated);
返回this.state.isAuthenticated
? onLogin(this.state)
: onLogout(this.state);
} .bind(本));
}
上面的示例在Stack Overflow上看到,楼主在componentWillMount时挂载了authChange事件,并且react有以下错误:
无法对卸载的组件执行React状态更新。这是一个无操作,但它表示应用程序中存在内存泄漏。要修复,请取消componentWillUnmount方法中的所有订阅和异步任务
含义:我们无法在组件销毁后设置状态以防止内存泄漏。
(1)我如何解决?
添加以下代码:
componentWillUnmount: function(){
This.off('authChange',this.authChange);
this.authChange=null;
}
显然,当dom结构被破坏时就是这种情况,但事件并没有清除内存泄漏,所以我们需要在componentWillUnmount时清除mount方法(2)Reactor内存泄漏相关的解释和解决方案
当我们使用事件绑定,setInterval,setTimeOut或某些函数时,这里会提到内存泄漏,但是在组件被销毁之前清除它时不会导致内存泄漏。这里我们手动重新组件以清除相关方法。
2.演示2
以下是一种常见情况:
this.pwdErrorTimer=setTimeout(()=>
{
this.setState({
showPwdError: false
})
},1000);
设置定时器延迟以设置状态,但在延迟期间,组件已被破坏,从而导致此类问题
解:
利用生命周期钩子函数:componentWillUnmount
componentWillUnmount(){
clearTimeout(this.pwdErrorTimer);
clearTimeout(this.userNameErrorTimer);
}
IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部