有没有办法在任何未安装的组件上普遍取消对 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 的缩小生产版本。这就是导致错误不显示的原因。当我解决这个问题时,控制台像圣诞树一样亮了起来。
首先我要说的是我实际上并不是想隐藏错误,我会修复它们,但我需要知道这是否可能。
我正在用 .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 的缩小生产版本。这就是导致错误不显示的原因。当我解决这个问题时,控制台像圣诞树一样亮了起来。