gpt4 book ai didi

javascript - React setState 只能更新已挂载或挂载的组件

转载 作者:行者123 更新时间:2023-12-03 13:06:19 25 4
gpt4 key购买 nike

我收到以下警告

"Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op. Please check the code for the ContactPage component."

当我第一次进入联系页面时,一切都很好。然后,如果我离开页面并返回,则会引发警告。

联系页面组件:

import React, { Component, PropTypes } from 'react';
import AppStore from '../../stores/AppStore';
import AppActions from '../../actions/AppActions';
import DataContent from './DataContent';

const title = 'Contact Us';


class ContactPage extends Component {

constructor(props) {
super(props);
this.state = AppStore.getState();
AppActions.getData();
}

static contextTypes = {
onSetTitle: PropTypes.func.isRequired,
};

componentWillMount() {
this.context.onSetTitle(title);
AppStore.listen(this.onChange.bind(this));
}

componentWillUnmount() {
AppStore.unlisten(this.onChange.bind(this));
}

onChange(state) {
this.setState(state);
}

renderData() {
return this.state.data.map((data) => {
return (
<DataContent key={data.id} data={data} />
)
})
}

render() {
return (
<div className={s.root}>
<div className={s.container}>
<h1>{title}</h1>
<div>
{ this.renderData() }
</div>
</div>
</div>
);
}

}

export default ContactPage;

当我放入调试器时,在加载联系页面时它会命中 componentWillMount()。当我离开联系页面时,它会点击 componentWillUnmount()。当我导航回页面时,它再次点击 componentWillMount() ,然后在点击 onChange(state) 函数时抛出错误。

最佳答案

问题是前一个组件实例的监听器仍然注册。由于先前的实例不再安装,因此您会收到该错误。

.bind 始终返回一个new 函数。所以如果你这样做

AppStore.unlisten(this.onChange.bind(this));

然后您尝试删除一个不存在的监听器(当然会失败)。它不会删除您通过AppStore.listen(this.onChange.bind(this))注册的监听器

<小时/>

要解决此问题,您应该在构造函数中绑定(bind)处理程序一次:

this.onChange = this.onChange.bind(this);

然后使用AppStore.listen(this.onChange)AppStore.unlisten(this.onChange)

关于javascript - React setState 只能更新已挂载或挂载的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35345338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com