-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
React:hooks有哪些? #27
Comments
useEffectuseEffect和useLayoutEffect的区别 |
useContext
|
useReducer作用:用于管理复杂的数据结构(useState一般用于管理扁平结构的状态),基本实现了redux的核心功能,事实上,基于Hooks Api可以很容易地实现一个useReducer Hook: |
useCallbackuseEffect deps需要准确的传入参数,而由于浅比较,函数、对象每一次都不会相同,所以useCallbacl的出现是为了减少由于函数而导致的不必要的渲染和执行。
|
useMemo & memo
在函数组件中,React提供了一个和类组件中和PureComponent相同功能的API React.memo,会在自身re-render时,对每一个 props 项进行浅对比,如果引用没有变化,就不会触发重渲染。 |
useRef关于useRef其实官方文档已经说得很详细了,useRef Hook返回一个ref对象的可变引用,但useRef的用途比ref更广泛,它可以存储任意javascript值而不仅仅是DOM引用。 |
|
参考链接
useState、useEffect、useCallBack、useMemo、useContext、useReducer、useRef、useLayoutEffect
useLayoutEffect:用法和useEffect一致,与useEffect的差别是执行时机,useLayoutEffect是在浏览器绘制节点之前执行(和componentDidMount以及componentDidUpdate执行时机相同)
类组件有着耦合性高的缺点,数据之间和功能部分的重复较高,数据问题Redux和flux解决了问题。hooks的出现就是为了解决功能复用的问题。
Function Component和Class Component
Function组件是对于无状态组件的思考,什么样的组件不需要state,只需要props进行数据之间的通讯。
Hooks带给了Function组件的状态管理化
useState带给了function的state。
useState为啥不返回object而是返回tuple?
如果 useState 返回数组,那么你可以顺便对数组中的变量命名,代码看起来也比较干净。而如果是对象的话返回的值必须和 useState 内部实现返回的对象同名,这样你只能在 function component 中使用一次,想要多次使用 useState 必须得重命名返回值。
为什么必须在函数组件顶部作用域调用Hooks API
在函数组件中,memoizedState被设计成一个链表(Hook对象):
Hook API调用会产生一个对应的Hook实例(并追加到Hooks链),但是返回给组件的是state和对应的setter,re-render时框架并不知道这个setter对应哪个Hooks实例(除非用HashMap来存储Hooks,但这就要求调用的时候把相应的key传给React,会增加Hooks使用的复杂度)。
re-render时会从第一行代码开始重新执行整个组件,即会按顺序执行整个Hooks链,如果re-render时sth不满足,则会执行useState(5)分支,相反useState(4)则不会执行到,导致useState(5)返回的值其实是4,因为首次render之后,只能通过useState返回的dispatch修改对应Hook的memoizedState,因此必须要保证Hooks的顺序不变,所以不能在分支调用Hooks,只有在顶层调用才能保证各个Hooks的执行顺序!
useState hook更新过程
合并了setState
The text was updated successfully, but these errors were encountered: