从另一个类组件打开对话框时出现错误:“无法对未安装的组件执行 React 状态更新。这是一个无操作,但它表明您的应用程序中存在内存泄漏。要修复,请取消所有订阅和componentWillUnmount 方法中的异步任务"
index.js
import ...
class AdMenu extends Component {
componentWillMount = () => {
this.onSearch();
};
onOpenInsert = () => {
showDetailDialog();
};
onSearch = () => {
fetch(_url, ...)
.then(response => {
if (response.ok) {
return response.json();
} else {
throw response;
}
})
.then(responseJson => {
this.setState({...});
})
.catch(response => {...});
};
render() {
return (
<div>
<DetailDialog />
<Button color="primary" onClick={this.onOpenInsert}>Add New</Button>
<BootstrapTable .... />
</div>
);
}
}
export default withTranslation()(AdMenu);
DetailDialog.js
export var showDetailDialog = function () {
this.setState({open: true});
console.log('Mounted: ' + this.mounted);
};
class DetailDialog extends React.Component {
mounted = false;
controller = new AbortController();
constructor(props) {
super(props);
this.state = {open: false};
showDetailDialog = showDetailDialog.bind(this);
}
componentDidMount() {
console.log('componentDidMount');
this.mounted = true;
}
componentWillUnmount(){
console.log('componentWillUnmount');
this.mounted = false;
}
onClose = () => {
this.setState({open: false});
};
render() {
return (
<Modal isOpen={this.state.open} toggle={this.onClose} className={"modal-primary"} >
<ModalHeader toggle={this.onClose}>Detail</ModalHeader>
<ModalBody>
...
</ModalBody>
</Modal>
);
}
}
export default withTranslation()(DetailDialog);
我有一个 DetailDialog 导出的类组件和函数 showDetailDialog。它导入到 index.js 页面。
当我第一次打开页面并单击打开对话框时,工作正常。但是当我在菜单中通过路由器切换到另一个页面然后第二次再次打开页面时,控制台日志中出现错误。
我尝试使用 this.mounted var 检查未安装的组件,但我不知道当组件在第二次和下一次卸载时如何设置状态以打开详细信息对话框。
我试过使用 controller = new AbortController(); 和 componentWillUnmount() 中的 controller.abort() 但不起作用。
或者这个问题的任何解决方案?
谢谢!
CodeSandbox 上的来源:https ://codesandbox.io/s/coreuicoreuifreereactadmintemplate-5unwj
阶梯测试:
点击广告菜单(第 1 次)
点击广告组
点击广告菜单(第 2 次)
点击广告菜单中的打开对话框
查看控制台日志浏览器
文件:src/views/category
节点 v11.12.0
Npm 6.7.0
窗口 10