Skip to content

Hooks Use

React Hooks 是 React 16.8 引入的一组功能,它们让你在不编写 class 组件的情况下使用状态和其他 React 特性。Hooks 的主要目的是让代码更简洁、更易于理解和维护。

一、 useState

useState 是一个用于在函数组件中添加状态的 Hook。它返回一个状态值和一个更新该状态的函数。

语法:

javascript
const [state, setState] = useState(initialState)

示例:

javascript
import React, { useState } from 'react'

function Counter() {
  const [count, setCount] = useState(0)

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>Click me</button>
    </div>
  )
}

二、 useEffect

useEffect 是一个在函数组件中执行副作用的 Hook。它可以用来代替生命周期方法,比如 componentDidMountcomponentDidUpdate

语法:

javascript
useEffect(() => {
  // effect
  return () => {
    // cleanup
  }
}, [dependencies])

示例:

javascript
import React, { useState, useEffect } from 'react'

function Example() {
  const [count, setCount] = useState(0)

  useEffect(() => {
    document.title = `You clicked ${count} times`
  }, [count]) // Only re-run the effect if count changes

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>Click me</button>
    </div>
  )
}

三、 useContext

useContext 允许你在组件中使用上下文。它可以用来避免通过层层传递 props。

语法:

javascript
const value = useContext(MyContext)

示例:

javascript
import React, { useContext } from 'react'

const MyContext = React.createContext()

function Display() {
  const value = useContext(MyContext)
  return <div>{value}</div>
}

function App() {
  return (
    <MyContext.Provider value="Hello, World!">
      <Display />
    </MyContext.Provider>
  )
}

四、 useReducer

useReducer 是一种用来管理复杂状态逻辑的 Hook。它类似于 Redux,但它是内置的并且更轻量。

语法:

javascript
const [state, dispatch] = useReducer(reducer, initialState)

示例:

javascript
import React, { useReducer } from 'react'

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 (
    <div>
      <p>Count: {state.count}</p>
      <button onClick={() => dispatch({ type: 'increment' })}>+</button>
      <button onClick={() => dispatch({ type: 'decrement' })}>-</button>
    </div>
  )
}

五、 useRef

useRef 返回一个可变的 ref 对象,该对象的 .current 属性被初始化为传递的参数。它在整个组件的生命周期内持续存在。

语法:

javascript
const refContainer = useRef(initialValue)

示例:

javascript
import React, { useRef, useEffect } from 'react'

function TextInputWithFocusButton() {
  const inputEl = useRef(null)

  const onButtonClick = () => {
    inputEl.current.focus()
  }

  return (
    <div>
      <input ref={inputEl} type="text" />
      <button onClick={onButtonClick}>Focus the input</button>
    </div>
  )
}

六、 useMemo

useMemo 返回一个 memoized 值。当你需要记住计算结果并在依赖项未改变时重用它,以避免不必要的计算时使用。

语法:

javascript
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b])

示例:

javascript
import React, { useMemo, useState } from 'react'

function ExpensiveComponent({ a, b }) {
  const [count, setCount] = useState(0)

  const expensiveValue = useMemo(() => {
    return computeExpensiveValue(a, b)
  }, [a, b])

  return (
    <div>
      <p>Expensive value: {expensiveValue}</p>
      <button onClick={() => setCount(count + 1)}>Re-render</button>
    </div>
  )
}

function computeExpensiveValue(a, b) {
  console.log('Computing...')
  return a + b
}

七、 useCallback

useCallback 返回一个 memoized 回调函数。当你需要记住一个回调函数,并在依赖项未改变时重用它,以避免不必要的函数重建时使用。

语法:

javascript
const memoizedCallback = useCallback(() => {
  doSomething(a, b)
}, [a, b])

示例:

javascript
import React, { useState, useCallback } from 'react'

function CallbackComponent() {
  const [count, setCount] = useState(0)

  const handleClick = useCallback(() => {
    console.log('Button clicked', count)
  }, [count])

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
      <button onClick={handleClick}>Log Count</button>
    </div>
  )
}

八、总结

  • useState: 用于管理组件内部的状态。
  • useEffect: 用于执行副作用(例如数据获取、订阅等)。
  • useContext: 用于共享状态。
  • useReducer: 用于复杂状态逻辑的管理。
  • useRef: 用于访问 DOM 元素或存储 mutable 值。
  • useMemo: 用于记住计算结果。
  • useCallback: 用于记住回调函数。