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。它可以用来代替生命周期方法,比如 componentDidMount 和 componentDidUpdate。
语法:
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: 用于记住回调函数。