【问题标题】:`componentWillMount` warnings visible even though 'componentWillMount' is not explicitly used`componentWillMount` 警告可见,即使 'componentWillMount' 没有明确使用
【发布时间】:2020-03-05 06:35:43
【问题描述】:

在我的代码中,我没有明确使用 componentWillMount,但在运行 webpack 时仍然会看到一些警告。

react-dom.development.js:12386 警告:componentWillMount 已重命名,不推荐使用。有关详细信息,请参阅 https://fb.me/react-unsafe-component-lifecycles。

  • 将带有副作用的代码移至 componentDidMount,并在构造函数中设置初始状态。
  • 将 componentWillMount 重命名为 UNSAFE_componentWillMount 以在非严格模式下抑制此警告。在 React 17.x 中,只有 UNSAFE_ 名称可以使用。要将所有已弃用的生命周期重命名为新名称,您可以在项目源文件夹中运行 npx react-codemod rename-unsafe-lifecycles

请更新以下组件:foo、bar

我确实运行了建议的npx react-codemod rename-unsafe-lifecycles,但警告并没有消失,只是将其措辞改为

react-dom.development.js:12386 警告:componentWillMount 已重命名,不推荐使用。 [...]

这里,foobar 都是我们团队编写的自定义组件,也是外部库的一些组件。对 componentWillMount 的 Visual Studio 解决方案的完整搜索没有给我任何结果。有人可以解释一下我做错了什么吗?

我在another question 看到了一条评论说明

componentWillMount 没有任何明确的位置,但我确实 [...] 在带有 state={ tabindex:0 } 的构造函数之后有一行代码我如何将其“移动”到构造函数中?

答案是写 constructor(props) {super(props); this.state = { tabindex:0 }}。有人可以解释一下这里发生了什么吗?我必须在我们的代码中寻找什么样的模式?

更多详情

    printWarning    @   react-dom.development.js:12386
lowPriorityWarningWithoutStack  @   react-dom.development.js:12407
./node_modules/react-dom/cjs/react-dom.development.js.ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings   @   react-dom.development.js:12577
flushRenderPhaseStrictModeWarningsInDEV @   react-dom.development.js:25641
commitRootImpl  @   react-dom.development.js:24871
unstable_runWithPriority    @   scheduler.development.js:815
runWithPriority$2   @   react-dom.development.js:12188
commitRoot  @   react-dom.development.js:24865
finishSyncRender    @   react-dom.development.js:24251
performSyncWorkOnRoot   @   react-dom.development.js:24223
scheduleUpdateOnFiber   @   react-dom.development.js:23590
scheduleRootUpdate  @   react-dom.development.js:26945
updateContainerAtExpirationTime @   react-dom.development.js:26973
updateContainer @   react-dom.development.js:27075
(anonymous) @   react-dom.development.js:27663
unbatchedUpdates    @   react-dom.development.js:24375
legacyRenderSubtreeIntoContainer    @   react-dom.development.js:27662
render  @   react-dom.development.js:27756
./src/index.tsx @   index.tsx:52
__webpack_require__ @   bootstrap:19
0   @   bundle.js:152632
__webpack_require__ @   bootstrap:19
(anonymous) @   bootstrap:83
(anonymous) @   bootstrap:83

相关

【问题讨论】:

  • 可能是一个旧的库。堆栈跟踪说明了什么?
  • 是的,我在 2.x 版本中使用 antd,但由于架构问题,我无法更改它。 @JoeLloyd 在我的编辑中查看堆栈跟踪。
  • 正如乔上面所说的,几乎可以肯定antd 使用cWM。我很好奇更新antd 会遇到什么架构问题?关于过时的生命周期方法github.com/ant-design/ant-design/issues/9792 似乎是 github 上的一个未解决问题
  • @DJ2:这是我们的内部架构,不适用于 Antd3。

标签: javascript reactjs react-props


【解决方案1】:

您收到此警告是因为 componentWillMount 在较新的 React 版本中已弃用。如果您没有在任何地方使用componentWillMount,那么您的库之一是并且需要更新。

如果它让您感觉更好,您的生产版本将不会在控制台中显示这些警告。

如果您由于某种原因无法更新库,您可以尝试在控制台中通过将 console.warn = () => {} 之类的内容放在您的 App 组件的顶部来抑制这些错误,但我不建议这样做,因为那时您将不会'以后不能在你的代码中使用console.warn。在你能够更新你的图书馆之前,最好只是接受它们作为一种烦恼。

【讨论】:

  • 不管怎样,如果我在打开控制台的情况下加载此页面,我会看到有关 componentwillmount 的警告。我想在 SO 在某处进行一些更新之后,这可能不再适用。
  • 在我的例子中,emotion 样式的组件导致了这个警告。我希望他们会尽快更新。
  • 谢谢。但我希望看到一些更详细的答案,描述寻找罪魁祸首的算法。正如问题中提到的,警告的输出不是很有用。
  • @Onkeltem 一种算法来查找哪个库正在使用它们?我敢肯定,除非您可以访问所有外部库源代码并且可以爬取所有这些库以查找 componentWillMount 实例,否则该怎么做。根据 OP 的输出,问题可能与引导程序有关(请参阅更多详细信息的末尾)。
  • @MattCroak 有什么方法可以识别导致这些警告的库吗?
【解决方案2】:

如果您想使用这些方法,请在方法前面加上 UNSAFE_ 。这些方法被认为是“不安全的”,因为 React 团队希望依赖这些方法的代码在未来的 React 版本中更有可能出现错误。因此,您可以使用 UNSAFE_componentWillMount 抑制警告。

【讨论】:

    【解决方案3】:

    如果要将所有已弃用的生命周期(如 componentWillMount 或 componentWillReceiveProps)重命名为新名称,可以在项目源文件夹中运行 npx react-codemod rename-unsafe-lifecycles

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多