React Hooks 是一组可以在函数组件中使用的函数,使它们能够使用 state 和其他 React 特性而无需转换为类组件。以下是 React 中所有主要的 Hooks 方法及其用法的总结:
1. useState
- 用途:在函数组件中添加 state。
- 返回值:一个包含当前 state 值和更新该值的函数的数组。
- 用法:
function Example() { const [count, setCount] = useState(0); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click me </button> </div> ); }
2. useEffect
- 用途:在组件中执行副作用操作(如数据获取、订阅或手动修改 DOM)。
- 返回值:一个清除函数(在组件卸载或依赖项改变时执行)。
- 用法:
useEffect(() => { // 组件挂载后执行 document.title = 'Hello World'; // 返回一个清理函数,在组件卸载或依赖项改变时执行 return () => { // 清理操作 }; }, [dependencyArray]); // 可选的依赖项数组,用于控制副作用的重新执行
3. useContext
- 用途:让你能够在函数组件中订阅 React Context。
- 返回值:当前 Context 的值。
- 用法:
const value = useContext(MyContext);
4. useReducer
- 用途:一个 reducer 函数来管理组件的 state,类似于 Redux 的工作方式。
- 返回值:一个包含当前 state 值和 dispatch 函数的数组。
- 用法:
const initialState = {count: 0}; function reducer(state, action) { switch (action.type) { case 'increment': return {count: state.count + 1}; case 'decrement': return {count: state.count - 1}; default: throw new Error(); } } function Counter() { const [state, dispatch] = useReducer(reducer, initialState); return ( <> Count: {state.count} <button onClick={() => dispatch({type: 'increment'})}>+</button> <button onClick={() => dispatch({type: 'decrement'})}>-</button> </> ); }
5. useCallback
- 用途:返回一个记忆化的回调函数版本,该回调函数在依赖项不变的情况下不会改变。
- 返回值:记忆化的回调函数。
- 用法:
const memoizedCallback = useCallback( () => { // 你的回调函数逻辑 }, [dependencyArray] // 依赖项数组 );
6. useMemo
- 用途:返回一个记忆化的值。它仅会在依赖项改变时重新计算该值。
- 返回值:记忆化的值。
- 用法:
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
7. useRef
- 用途:持久化数据,其
.current属性被初始化为传递给useRef()的参数。该对象在组件的整个生命周期内保持不变。 - 返回值:一个可变的对象,其
.current属性被初始化为指定的值。 - 用法:
const myRef = useRef(initialValue);
8. useImperativeHandle
- 用途:自定义使用
useRef创建的 ref 对象的行为,使其能在父组件中使用一些命令式方法。 - 返回值:无(这是一个自定义 Hook 的辅助 Hook)。
- 用法:
useImperativeHandle(ref, createHandle, [deps]);
9. useLayoutEffect
-
用途:其用法与
useEffect相同,但它会在所有的 DOM 变更之后同步调用,可以用于读取 DOM 布局并同步触发重渲染。在浏览器执行绘制之前,useLayoutEffect内部的更新计划将被同步刷新。 -
返回值:一个清除函数(在组件卸载或依赖项改变时执行)。
-
用法:
useLayoutEffect(() => { // 浏览器绘制之前同步执行 // 可以用于读取 DOM 布局并同步触发重渲染 // 返回一个清理函数(可选) return () => { // 清理操作 }; }, [dependencyArray]); // 可选的依赖项数组
注意事项:
useLayoutEffect在所有的 DOM 变更之后同步调用,因此它适合用于需要读取 DOM 布局或执行与布局相关的同步操作的情况。- 与
useEffect不同,useLayoutEffect的调用是在浏览器绘制之前进行的,这意味着在屏幕上看到任何变化之前,所有的更新都已经被应用。 - 由于
useLayoutEffect是同步执行的,它可能会阻塞浏览器的绘制,因此应该谨慎使用,特别是在性能敏感的应用中。 - 在大多数情况下,
useEffect应该是首选,因为它不会阻塞浏览器的绘制过程,并且提供了更好的性能。
10. useDebugValue
-
用途:在 React 开发者工具中显示自定义的 label。这对于调试自定义 Hooks 尤其有用。
-
返回值:无(这是一个辅助 Hook,用于改善调试体验)。
-
用法:
useDebugValue(value); -
示例:
function useFriendStatus(friendID) { const [isOnline, setIsOnline] = useState(null); useEffect(() => { // ... 一些异步操作来检查 friendID 是否在线 }, [friendID]); // 使用 useDebugValue 来改善调试体验 useDebugValue(isOnline === null ? 'Loading...' : isOnline ? 'Online' : 'Offline'); return isOnline; }
在 React 开发者工具中,当你检查使用了 useFriendStatus Hook 的组件时,你会看到一个更友好的 label,比如 "Loading..."、"Online" 或 "Offline",而不是默认的 state 值。
总结
React Hooks 提供了一种在函数组件中使用 state 和其他 React 特性的强大方式,而无需转换为类组件。每个 Hook 都有其特定的用途和返回值,理解它们的用法和注意事项对于构建高效、可维护的 React 应用至关重要。