React 常用 Hooks 简介

React Hooks 是 React 16.8 中引入的一项功能,它允许你在不编写 class 的情况下使用 state 和其他 React 特性。Hooks 的出现极大地简化了函数组件的状态管理和副作用的处理。本文将介绍几个最常用的 Hooks,并提供简洁明了的示例代码。

useState

useState 是一个让函数组件能够使用 state 的 Hook。它接受初始状态并返回两个值:当前状态和更新状态的函数。

import React, { useState } from 'react';function Counter() {const [count, setCount] = useState(0);return (

You clicked {count} times

);}

在上面的例子中,useState 初始化计数器的值为 0。setCount 是一个函数,用来更新计数器的值。

useEffect

useEffect 让你在函数组件中执行副作用操作(如数据获取、订阅或手动更改 DOM)。它可以看作是 componentDidMountcomponentDidUpdatecomponentWillUnmount 这些生命周期方法的组合。

import React, { useState, useEffect } from 'react';function Example() {const [count, setCount] = useState(0);useEffect(() => {// 使用浏览器的 API 更新页面标题document.title = `You clicked ${count} times`;});return (

You clicked {count} times

);}

在这个例子中,useEffect 会在每次渲染后更新文档的标题。

useContext

useContext 让你可以访问 React 的 Context 对象,这个对象可以让你在组件树中传递数据而不必使用 props。

import React, { useContext } from 'react';const ThemeContext = React.createContext('light');function ThemedButton() {const theme = useContext(ThemeContext);return ;}

在上面的代码中,useContext 使得函数组件 ThemedButton 能够读取到最近的 ThemeContext 提供的主题。

useReducer

useReducer 是另一种可以在 React 函数组件中管理复杂 state 的方法。它通常用于组件中有多个子值的 state,或者当下一个 state 依赖于之前的 state 时。

import React, { useReducer } from 'react';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, { count: 0 });return (Count: {state.count});}

在上面的例子中,useReducer 接受一个 reducer 函数和初始状态,返回当前状态和 dispatch 函数,用于触发状态的更新。

useCallback

useCallback 返回一个记忆化的回调函数。这个回调函数仅在它的依赖项改变时才会更新,这有助于避免在渲染时不必要的重新渲染。

import React, { useState, useCallback } from 'react';function Example() {const [count, setCount] = useState(0);const increment = useCallback(() => {setCount(c => c + 1);}, []); // 依赖项为空数组,这个函数永远不会变return ;}

在这个例子中,increment 函数只会在组件首次渲染时创建一次。

useMemo

useMemo 用于返回一个记忆化的值。它只会在依赖项改变时重新计算这个值,有助于避免在每次渲染时都进行高开销的计算。

import React, { useState, useMemo } from 'react';function Example() {const [count, setCount] = useState(0);const doubleCount = useMemo(() => {return count * 2;}, [count]); // 只有当 count 变化时才重新计算return {doubleCount};}

在上面的代码中,doubleCount 只会在 count 改变时重新计算。

React Hooks 提供了一种强大而灵活的方式来共享逻辑和状态管理,而无需重构组件为类。上述 Hooks 是最常用的,但 React 还提供了其他 Hooks(如 useRef, useLayoutEffect, useImperativeHandle 等),以及允许你创建自定义 Hooks,以更好地适应你的应用需求。