React Hooks 是 React 16.8 版本引入的一个重要特性,它允许你在不编写 class 的情况下使用 state 以及其他 React 特性。Hooks 提供了一种更直接的方式来使用 React 的特性,如状态管理、副作用、上下文(Context)、引用(Refs)等,使得函数组件的功能更加强大和灵活。
以下是一些基本和常用的 React Hooks:
基本 Hooks
-
useState
- 用于在函数组件中添加状态。
- 示例:
const [count, setCount] = useState(0);
-
useEffect
- 用于在函数组件中执行副作用(例如,数据获取、订阅或手动修改 DOM)。
- 示例:
useEffect(() => { document.title = \You clicked ${count} times`; });`
-
useContext
- 用于让你在函数组件中访问 React 的 Context。
- 示例:
const value = useContext(MyContext);
额外的 Hooks
-
useReducer
- 用于状态逻辑复杂时替代
useState,接收一个形式为(state, action) => newState的 reducer,并返回当前的 state 以及与其配套的 dispatch 方法。 - 示例:
const [state, dispatch] = useReducer(reducer, initialArg, init);
- 用于状态逻辑复杂时替代
-
useCallback
- 返回一个记忆化的回调函数。
- 示例:
const memoizedCallback = useCallback(() => { doSomething(a, b); }, [a, b]);
-
useMemo
- 返回一个记忆化的值。
- 示例:
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
-
useRef
- 用于获取 DOM 元素的引用,或者存储任何可变值。
- 示例:
const myRef = useRef(initialValue);
-
useImperativeHandle
- 用于在使用 ref 时自定义暴露给父组件的实例值。
- 示例:
useImperativeHandle(ref, () => ({focus: () => { myRef.current.focus(); }}), [myRef]);
-
useLayoutEffect
- 其作用和
useEffect相似,但它在所有的 DOM 变更之后同步调用,可以用来读取 DOM 布局并同步重新渲染。 - 示例:
useLayoutEffect(() => { /* 更新 DOM */ });
- 其作用和
-
useDebugValue
- 可用于在 React 开发者工具中显示自定义的 hook 标签。
- 示例:
useDebugValue(isOnline ? 'Online' : 'Offline');
Hooks 提供的是一种使你的组件更为纯净和逻辑清晰的方式,通过组合这些 Hooks,可以构建出复杂且易于管理的组件。它们改变了 React 组件的编写方式,使得功能更加模块化,代码更加简洁。