react hooks实现
React Hooks 是 React 16.8 引入的特性,允许在函数组件中使用状态和其他 React 特性,而无需编写类组件。以下是常见 Hooks 的实现方式和用法示例。
useState
useState 用于在函数组件中管理局部状态。它返回一个状态值和一个更新状态的函数。
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}
useEffect
useEffect 用于处理副作用,如数据获取、订阅或手动修改 DOM。它可以模拟类组件的 componentDidMount、componentDidUpdate 和 componentWillUnmount。
import React, { useState, useEffect } from 'react';
function DataFetcher() {
const [data, setData] = useState(null);
useEffect(() => {
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => setData(data));
}, []); // 空依赖数组表示仅在组件挂载时运行
return <div>{data ? data.message : 'Loading...'}</div>;
}
useContext
useContext 用于在组件中访问 React 的 Context,避免多级 props 传递。
import React, { useContext } from 'react';
const ThemeContext = React.createContext('light');
function ThemedButton() {
const theme = useContext(ThemeContext);
return <button className={theme}>Themed Button</button>;
}
useReducer
useReducer 是 useState 的替代方案,适用于复杂状态逻辑。它接受一个 reducer 函数和初始状态,返回当前状态和 dispatch 函数。
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 属性初始化为传入的参数。常用于访问 DOM 节点或存储可变值。
import React, { useRef } from 'react';
function TextInput() {
const inputRef = useRef(null);
const focusInput = () => {
inputRef.current.focus();
};
return (
<div>
<input ref={inputRef} type="text" />
<button onClick={focusInput}>Focus Input</button>
</div>
);
}
自定义 Hook
自定义 Hook 可以将组件逻辑提取到可重用的函数中。自定义 Hook 的名称必须以 use 开头。
import { useState, useEffect } from 'react';
function useFetch(url) {
const [data, setData] = useState(null);
useEffect(() => {
fetch(url)
.then(response => response.json())
.then(data => setData(data));
}, [url]);
return data;
}
function UserProfile() {
const user = useFetch('https://api.example.com/user');
return <div>{user ? user.name : 'Loading...'}</div>;
}
注意事项
- Hooks 只能在函数组件的顶层调用,不能在循环、条件或嵌套函数中使用。
- Hooks 的调用顺序必须保持一致,确保 React 能正确追踪状态。
- 自定义 Hook 内部可以调用其他 Hooks,但必须遵循 Hooks 的规则。







