网站首页 > 文章精选 正文
一、原生方案
1.useState(局部状态)
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<button onClick={() => setCount(c => c + 1)}>+</button>
<span>{count}</span>
</div>
);
}
场景:单个组件的按钮计数器
2.useReducer(复杂状态)
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>
<button onClick={() => dispatch({ type: 'decrement' })}>-</button>
<span>{state.count}</span>
<button onClick={() => dispatch({ type: 'increment' })}>+</button>
</div>
);
}
场景:带多种操作的计数器逻辑
3. Context API (跨组件共享)
// 创建Context
const ThemeContext = createContext('light');
// 提供者组件
function App() {
const [theme, setTheme] = useState('light');
return (
<ThemeContext.Provider value={{ theme, setTheme }}>
<Toolbar />
</ThemeContext.Provider>
);
}
// 消费者组件
function Toolbar() {
const { theme, setTheme } = useContext(ThemeContext);
return (
<button onClick={() => setTheme(t => t === 'light' ? 'dark' : 'light')}>
当前主题: {theme}
</button>
);
}
场景:主题切换全局状态
二、第三方库
1. Redux (可预测状态容器)
// store.js
import { createStore } from 'redux';
const counterReducer = (state = 0, action) => {
switch (action.type) {
case 'INCREMENT': return state + 1;
case 'DECREMENT': return state - 1;
default: return state;
}
};
const store = createStore(counterReducer);
// Component
import { useSelector, useDispatch } from 'react-redux';
function Counter() {
const count = useSelector(state => state);
const dispatch = useDispatch();
return (
<div>
<button onClick={() => dispatch({ type: 'DECREMENT' })}>-</button>
<span>{count}</span>
<button onClick={() => dispatch({ type: 'INCREMENT' })}>+</button>
</div>
);
}
场景:跨多组件共享计数器状态
2. MobX (响应式状态)
// store.js
import { makeAutoObservable } from 'mobx';
class CounterStore {
count = 0;
constructor() {
makeAutoObservable(this);
}
increment() { this.count++; }
decrement() { this.count--; }
}
const counterStore = new CounterStore();
// Component
import { observer } from 'mobx-react-lite';
const Counter = observer(() => (
<div>
<button onClick={() => counterStore.decrement()}>-</button>
<span>{counterStore.count}</span>
<button onClick={() => counterStore.increment()}>+</button>
</div>
));
场景:需要自动跟踪依赖的复杂业务逻辑
3. Zustand (轻量级状态)
// store.js
import create from 'zustand';
const useCounterStore = create(set => ({
count: 0,
increment: () => set(state => ({ count: state.count + 1 })),
decrement: () => set(state => ({ count: state.count - 1 }))
}));
// Component
function Counter() {
const { count, increment, decrement } = useCounterStore();
return (
<div>
<button onClick={decrement}>-</button>
<span>{count}</span>
<button onClick={increment}>+</button>
</div>
);
}
场景:快速实现全局计数器,无需复杂配置
4. Jotai (原子化状态)
// store.js
import { atom, useAtom } from 'jotai';
const countAtom = atom(0);
// Component
function Counter() {
const [count, setCount] = useAtom(countAtom);
return (
<div>
<button onClick={() => setCount(c => c - 1)}>-</button>
<span>{count}</span>
<button onClick={() => setCount(c => c + 1)}>+</button>
</div>
);
}
场景:需要组合多个独立状态的高效更新
5. React Query (远程状态)
import { useQuery } from 'react-query';
function UserProfile({ userId }) {
const { data, isLoading, error } = useQuery(
['user', userId],
() => fetch(`/api/users/${userId}`).then(res => res.json())
);
if (isLoading) return 'Loading...';
if (error) return 'Error!';
return (
<div>
<h1>{data.name}</h1>
<p>{data.email}</p>
</div>
);
}
场景:管理用户数据请求与自动缓存
三、选型决策树
- 数据范围
- 组件内部 → useState/useReducer
- 跨组件共享 → Context/Redux/Zustand
- 服务端状态 → React Query
- 更新频率
- 低频更新 → Context API
- 高频更新 → Jotai/Zustand
- 项目规模
- 小型项目 → Zustand + React Query
- 大型项目 → Redux Toolkit + TypeScript
四、性能优化
- Context 分层:为不同数据创建独立 Context
- 状态分片:使用 Redux Toolkit 或 Zustand 的切片功能
- 记忆化:React.memo + useMemo/useCallback 减少重渲染
- 原子化更新:Jotai/Recoil 实现精准更新
猜你喜欢
- 2025-05-14 TS,TypeScript,Windows环境下构建环境,安装、编译且运行
- 2025-05-14 TypeScript 也能开发AI应用了!
- 2025-05-14 搞懂 TypeScript 装饰器
- 2025-05-14 前端小哥哥:如何使用typescript开发实战项目?
- 2025-05-14 在 React 项目中,一般怎么处理错误?
- 2025-05-14 Vue3开发极简入门(2):TypeScript定义对象类型
- 2025-05-14 C#与TypeScript语法深度对比
- 2025-05-14 360前端一面~面试题解析
- 2025-05-14 Python标准库中的七个“小众但神奇”的实用函数
- 2025-05-14 ArkTS中的空安全:全面解析与实践
- 05-14TS,TypeScript,Windows环境下构建环境,安装、编译且运行
- 05-14TypeScript 也能开发AI应用了!
- 05-14搞懂 TypeScript 装饰器
- 05-14前端小哥哥:如何使用typescript开发实战项目?
- 05-14在 React 项目中,一般怎么处理错误?
- 05-14react19 常用状态管理
- 05-14Vue3开发极简入门(2):TypeScript定义对象类型
- 05-14C#与TypeScript语法深度对比
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)