有关Hook实现getDerivedStateFromProps的小思考 #114
zhangyu1818
announced in
zh-cn
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
用类组件有一个很方便的生命周期就是
getDerivedStateFromProps,我用这个生命周期最主要的还是实现一些受控组件。但是函数组件没有生命周期的概念,所以自然也没有这个方法了,但是细心的同学一定可以看到官方文档上是有解答过这个问题的。
在看官方解答之前,先了解一下类组件的
getDerivedStateFromProps生命周期是什么时候执行的。getDerivedStateFromProps的执行时机
getDerivedStateFromProps在源码里Mount时和Update时都会触发,并且执行时机是同步的,在源码里就是简单的值的修改,所以也不会发起新的更新。官方FAQ的解答
我想一些同学如果没有看过官方的解答,可能会像下面这样做。
因为我在最初用
Hook的时候就这样写过,这样写都不是组件频繁发起更新调度的问题,而是useEffect是异步的,可能会有一些小问题。抛出错误的方法,看看官方的解答。
官方的解答就直接放在函数体中直接修改的值。
按照逻辑来讲和
getDerivedStateFromProps的执行时机是一样的,但是如果你参照这样的方式实现,并在函数体里console一下,就会发现函数体中内部的setState方法好像是触发了函数组件的重新渲染,因为会console多个值。原因就在于函数组件无论是要获取新的
Hook的值还是干什么的,每次都会重新执行该函数组件,如果是在函数体里执行的setState,React会记录下来。简单的看一下源码逻辑。
源码里执行函数组件的过程中如果发起了更新调度,就会同步的再执行一次函数组件来获取新的
children值。所以好像触发了重新渲染,实际上只是函数组件再执行了一次,这样有什么问题呢?
然而官方的解答肯定不会有问题…我想如果是一个超级重的,像以前看别人写的3000行函数组件这样的肯定会有一些小小的性能影响。
那么问题来了,怎么才能做到像真正的
getDerivedStateFromProps生命周期呢?我的小想法
如果使用
useState,setState将props的值赋值给state的时候必定会让函数组件重新执行,如果我们能手动控制函数组件是否刷新不就完事儿了。所以可以使用
useRef来存state的值,然后单独执行useState来发起更新调度。这样好像就完美复现了。
Beta Was this translation helpful? Give feedback.
All reactions