这是因为在原型化过程中,我发现传入的新道具可能是一个复杂对象的数组,所以prevProps.myProp===this.props.myProp
总是false
。在比较之前,JSON.stringify
对两者进行比较,但感觉不可靠。
我试图为类组件编写一个可重用的函数,比较react的componentDidUpdate
中的prev/新道具。例如:
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库时遇到了一些问题,但我仍然觉得我不应该这样做,而且遗漏了一些东西--是否有一种普遍接受的“正常”方法来这样做,还是我有这个问题只是一个迹象:
)。
发布于 2020-06-18 13:36:27
,这意味着当传入的道具发生变化时,这些道具会立即反映在状态中。
是的,那是不对的。当我刚开始的时候,我也在做同样的事情。
state
是该组件“拥有”的东西(值得注意的是:并非所有组件都需要状态!)props
是由更高的组件“拥有”的东西。最好的例子:
ComponentA将一个id传递给ComponentB作为支柱。ComponentB使用这个id来发出API请求(例如)。
该API请求的状态/结果构成ComponentB状态的一部分(它由您的组件“拥有”)。作为一个支柱传入的id不是ComponentB状态的一部分(它是由ComponentA拥有的,也可能是在树的更高的某个地方传递给ComponentA的一个支柱)。
当id支柱发生更改时,ComponentB将需要发出另一个API请求。
编辑:
生命周期方法的复杂性是为什么React高度鼓励功能组件的原因。
您应该将组件视为函数。如果仅仅把逻辑看作是输入->输出,那么编写逻辑就容易多了。
componentDidUpdate
已经通过一个依赖项列表转移到useEffect
,所以您可以这样说--运行这个函数,但是只有当这个支柱发生变化时--这是将大量的componentDidUpdate
方法分解为微小的readbale/可测试块的好方法。
我听过很多人说钩子毁了反应,但我非常不同意他们的看法。React看到了人们通过误用基于类/实例的组件而在社区中遇到的问题,而不是教人们如何正确地使用它们,而是通过引入一个更简单的API (函数仍然可以也将被滥用)来促使人们编写更好的组件--它们通常比类更容易处理,并且与组合(而不是继承)和声明性组件(而不是命令)保持一致。
https://stackoverflow.com/questions/62451028
复制相似问题