我有一段遗留代码,它会在每次请求时在服务器上呈现一个react组件,这显然存在内存泄漏。我已经解决了这段代码的问题:
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));
},
我相信this
对象在每次请求时都会存储一个新的侦听器,但我不明白为什么this
元素在渲染组件时没有被标记为垃圾完了。
答案 0 :(得分:6)
在卸载组件之前,您需要取消绑定authChange
处理程序。您可以在componentWillUnmount
。
由于您是使用传入的第一个道具创建处理函数,因此您应该将其保存到属性中,以便以后可以取消绑定:
componentWillMount: function () {
var onLogin = this.props.onLogin || function () {},
onLogout = this.props.onLogout || function () {};
this.authChange = function () {
console.log('user authenticated:', this.state.isAuthenticated);
return this.state.isAuthenticated
? onLogin(this.state)
: onLogout(this.state);
}.bind(this);
this.on('authChange', this.authChange);
},
componentWillUnmount: function () {
this.off('authChange', this.authChange);
this.authChange = null;
}
请注意,当我看到this.on
时,我认为您可能正在使用jQuery,但目前尚不清楚会出现这种情况。我的回答使用this.off
来分离事件监听器,但你应该使用框架中相应方法的任何内容。
答案 1 :(得分:2)
我会将您的功能移至componentDidMount
并在componentWillUnmount
重要:在服务器和客户端上调用componentWillMount
,但仅调用componentDidMount
的客户端强>
如果您使用的是eventListeners
,setInterval
或其他需要清理的功能,请将它们放在componentDidMount
中。服务器不会调用componentWillUnmount
,通常是内存泄漏的原因。