【问题标题】:Purpose of componentWillReceiveProps/getDerivedStateFromPropscomponentWillReceiveProps/getDerivedStateFromProps 的用途
【发布时间】:2023-03-19 18:37:01
【问题描述】:

我刚刚学习 React,遇到了一些我无法在任何地方找到解释的东西。

在我读过的关于 React 组件的每一本书/博客中,我都看到过这样的声明:组件 props 是不可变的。更改组件属性的唯一方法是重新创建它。不过,情况似乎并非如此。

在阅读“React in Action”和“React Quickly”时,我遇到了对componentWillReceiveProps 的引用,并解释了在要更改props(不是状态)时使用此方法。我已经看过这方面的文档(以及较新的 getDerivedStateFromProps 函数)。

componentWillReceiveProps 的文档说明:

componentWillReceiveProps() is invoked before a mounted component receives new props. 

getDerivedStateFromProps 的文档指出:

This method exists for rare use cases where the state depends on changes in props over time. 

这些都没有解释如何在组件的生命周期中随时接收(和更改?)不可变道具。

那么,这里到底发生了什么?如果道具无法更改,这些功能/方法有什么用?或者,书籍/博客是不是弄错了,毕竟它们真的不是一成不变的?

【问题讨论】:

  • 对于那些对这个问题投了反对票的人,请理解您几乎到处都能找到的描述将 React 组件描述为具有不可变的 props。这是非常令人困惑和误导的。道具不能从组件内部更改,但显然它们可以由父级更改。这是生命周期的一个怪癖,在我看到的任何地方都没有真正解释,直到@ray_hatfield 指出它。

标签: javascript reactjs react-hooks react-lifecycle


【解决方案1】:

可以使用新的/更新的/不同的道具重新渲染组件。考虑以下组件:

function Parent () {
    const [count, setCount] = useState(0);

    setInterval(() => setCount(count + 1), 1000);

    return (
      <CounterDisplay count={count} />
    )
}

CounterDisplay 组件将使用新的 count 属性每秒重新渲染一次(ish)。如果 CounterDisplay 需要在重新渲染之前响应新的 prop 做一些事情,可以实现 componentWillReceiveProps

实际上,这在运行最新版本的 React 的项目中非常罕见。我已经好几年没有在 React 组件中实现 componentWillReceiveProps 方法了。

【讨论】:

  • 我不知道这会“重用”现有组件。我认为它会完全用一个新的CounterDisplay 组件重新渲染。但是,如何将这个正方形与 props 传递给构造函数。这不意味着正在构建一个新组件吗?还是 React 静默更新 props 并在子组件上调用 render(在现在调用 getDerivedStateFromProps 之后)?
  • 组件初始实例化时调用构造函数。 React 将在 props 或 state 更改时重用/重新渲染现有实例,只要它保持挂载。
  • 谢谢。这就解释了。我对生命周期的理解是错误的。一个注重效率的框架不会卸载组件是有道理的,因为它正在使用新的道具重新渲染。我只是没想到会这样。
  • 为了它的价值:我不记得我上次写一个类组件是什么时候了。现在都是函数组件和钩子了。
猜你喜欢
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 2020-06-08
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
相关资源
最近更新 更多