-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in 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: