下列所写,部分要照伪代码来理解
State Hook
1 | const [state, setState] = useState(initialState); |
By Reducer
1 | const reducer = (prevstate, action) => newState |
Effect Hook
1 | useEffect( |
同步版本:useLayoutEffect
Context Hook
1 | const value = useContext(MyContext); |
Memo Hook 和 Callback Hook
这一部分的hook其实是为了优化性能。但是:
大多数时候,你不需要考虑去优化不必要的重新渲染。
函数签名
1 | function useCallback<T>( |
React 文档的解释
useMemo
避免在每次渲染时都进行高开销的计算
useCallback
使用引用相等性去避免非必要渲染
另外,React 文档里有说到
useCallback(fn, deps)
相当于useMemo(() => fn, deps)
。
个人理解
因为 useMemo
主要是为了避免多次进行高开销的计算。因为每次创建的只是一个可以计算结果的函数,并没有实际进行计算(当然,除了第一次以及依赖改变的时候)。
而 useCallback
主要是为了前后返回值(主要是回调函数)的引用相等性。因为基于引用相等性(特别是对于对象来说),可以让其他依赖于此的组件可以去避免非必要渲染。
虽然用 useMemo
也可以实现 useCallback
,但是没有必要,因为目的不同。并且 useMemo
并不保证引用相等性。
Ref Hook
1 | const refContainer = useRef(initialValue); |
ImperativeHandle Hook 和 forwardRef
1 | useImperativeHandle(ref, createHandle, [deps]) |
1 | const FancyInput = forwardRef((props, ref)=>{ |
相当于此时,ref
就只能用focus了,或者只有focus有响应。
DebugValue Hook
useDebugValue
可用于在 React 开发者工具中显示自定义 hook 的标签。
1 | useDebugValue(value) |