首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >比较prevProps在componentDidUpdate中的正常/标准方法

比较prevProps在componentDidUpdate中的正常/标准方法
EN

Stack Overflow用户
提问于 2020-06-18 13:24:42
回答 1查看 342关注 0票数 0

这是因为在原型化过程中,我发现传入的新道具可能是一个复杂对象的数组,所以prevProps.myProp===this.props.myProp总是false。在比较之前,JSON.stringify对两者进行比较,但感觉不可靠。

我试图为类组件编写一个可重用的函数,比较react的componentDidUpdate中的prev/新道具。例如:

代码语言:javascript
运行
复制
componentDidUpdate(prevProps) {
    // First, get difference here, possibly using a lib like npm 'deep-object-diff'.
    // ...or just JSON.stringify both and do string comparison
    const changes = getTheDifference(prevProps, this.props)

    // Don't do anything if there's no changes.
    if (!changes) return

    // Then I want to do something like:
    this.setState( Object.assign(this.state, changes) )
}

...that意味着每当传入的道具发生变化时,这些道具就会立即反映在状态中。我在寻找一个合适的diff库时遇到了一些问题,但我仍然觉得我不应该这样做,而且遗漏了一些东西--是否有一种普遍接受的“正常”方法来这样做,还是我有这个问题只是一个迹象:

  • 组件试图做太多/状态太复杂?
  • ,我应该用类似于Redux的东西将道具映射到状态吗?(试图避免这一点,直到绝对necessary)
  • I'm过度考虑它,有时组件的componentDidUpdate中的逻辑只是复杂和唯一的?

)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-18 13:36:27

,这意味着当传入的道具发生变化时,这些道具会立即反映在状态中。

是的,那是不对的。当我刚开始的时候,我也在做同样的事情。

  1. state是该组件“拥有”的东西(值得注意的是:并非所有组件都需要状态!)
  2. props是由更高的组件“拥有”的东西。

最好的例子:

ComponentA将一个id传递给ComponentB作为支柱。ComponentB使用这个id来发出API请求(例如)。

该API请求的状态/结果构成ComponentB状态的一部分(它由您的组件“拥有”)。作为一个支柱传入的id不是ComponentB状态的一部分(它是由ComponentA拥有的,也可能是在树的更高的某个地方传递给ComponentA的一个支柱)。

当id支柱发生更改时,ComponentB将需要发出另一个API请求。

编辑:

生命周期方法的复杂性是为什么React高度鼓励功能组件的原因。

您应该将组件视为函数。如果仅仅把逻辑看作是输入->输出,那么编写逻辑就容易多了。

componentDidUpdate已经通过一个依赖项列表转移到useEffect,所以您可以这样说--运行这个函数,但是只有当这个支柱发生变化时--这是将大量的componentDidUpdate方法分解为微小的readbale/可测试块的好方法。

我听过很多人说钩子毁了反应,但我非常不同意他们的看法。React看到了人们通过误用基于类/实例的组件而在社区中遇到的问题,而不是教人们如何正确地使用它们,而是通过引入一个更简单的API (函数仍然可以也将被滥用)来促使人们编写更好的组件--它们通常比类更容易处理,并且与组合(而不是继承)和声明性组件(而不是命令)保持一致。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62451028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档