有没有办法在任何未安装的组件上普遍取消对 setstate 的所有调用或隐藏尝试它产生的错误?

Is there a way to universally cancel all calls to setstate on any unmounted component or to hide the errors produced by attempting it?

首先我要说的是我实际上并不是想隐藏错误,我会修复它们,但我需要知道这是否可能。

我正在用 .net 后端重写一个 React 项目,从框架过渡到核心。

我有两个基本相同的组件(一个在原始项目中,一个在新项目中)。

它们是一种模式,打开后会收集并显示一篇文章。 如果模式关闭,组件将被卸载,如果它在返回文章数据之前(使用提取),它当前会出错,因为它正在尝试更新未安装组件的状态。

此行为是预期的。

在新项目中,我正要添加一个 AbortController 以在需要时中止获取调用,但我注意到在旧项目中,在收集数据之前关闭模式时,没有给我一个错误。组件卸载,然后状态更新,但由于某种原因我没有收到错误。 没有 'isMounted' 变量跟踪挂载状态,也没有中止控制器。

我在每个相关方法中添加了控制台日志,以确保它在状态更新之前被卸载。

old project console output

new project console output

有什么东西可以隐藏这些错误吗?还是一起阻止行动?

两个项目都使用 React 16,但旧项目是外部引用的 (https://unpkg.com/react@16/umd/react.development.js),新项目是通过 npm (^16.8.6) 提供的。

这是旧项目的相关代码,因为这是没有产生错误的代码(新项目几乎相同)

componentDidMount() {
    fetch(`{url to get article}`,
        { credentials: "include", headers: { accept: "application/json" } })
        .then(res => res.json())
        .then(gatheredData => this.setState({ gatheredData }))
}

没有 componentWillUnmount。

当我无法从组件中删除调用时,我就是这样做的

componentDidMount() {
    this.mounted=true
    fetch(`{url to get article}`,
        { credentials: "include", headers: { accept: "application/json" } })
        .then(res => res.json())
        .then(gatheredData => {
          if (this.mounted) {
            this.setState({ gatheredData })
          }
        })
}

componentWillUnmount() {
    this.mounted=false
}

我发现在旧项目中,原作者是这样写的(即使在开发中指定使用完整版本)它总是从外部导入 react 的缩小生产版本。这就是导致错误不显示的原因。当我解决这个问题时,控制台像圣诞树一样亮了起来。