在 React 18 中使用 Redux 的基本步骤和以前的版本差别不大,但 React 18 引入了一些新的特性(比如并发渲染),可能会影响你在使用 Redux 时的实现方式。以下是一个简洁的指南,展示如何在 React 18 中结合 Redux 来管理状态:
1. 安装必要的依赖
首先,你需要安装 Redux 和 React-Redux(Redux 的 React 绑定库)。可以用 npm 或 yarn 安装:
npm install redux react-redux @reduxjs/toolkit
@reduxjs/toolkit
是官方推荐的工具包,简化了 Redux 的配置和使用。
2. 创建 Redux Store
使用 @reduxjs/toolkit
的 configureStore
来创建 Redux store。例如:
// src/store.js
import { configureStore } from '@reduxjs/toolkit';
import counterReducer from './features/counterSlice';
export const store = configureStore({
reducer: {
counter: counterReducer, // 你的 reducer
},
});
3. 定义 Reducer 和 Action
使用 @reduxjs/toolkit
的 createSlice
来定义 reducer 和 action。例如:
// src/features/counterSlice.js
import { createSlice } from '@reduxjs/toolkit';
const counterSlice = createSlice({
name: 'counter',
initialState: {
value: 0,
},
reducers: {
increment: (state) => {
state.value += 1;
},
decrement: (state) => {
state.value -= 1;
},
},
});
export const { increment, decrement } = counterSlice.actions;
export default counterSlice.reducer;
4. 在 React 应用中提供 Store
将 Redux store 通过 Provider
提供给你的 React 组件树。通常在应用的入口文件(比如 index.js
或 App.js
)中完成:
// src/index.js
import React from 'react';
import { createRoot } from 'react-dom/client';
import { Provider } from 'react-redux';
import { store } from './store';
import App from './App';
const container = document.getElementById('root');
const root = createRoot(container);
root.render(
<Provider store={store}>
<App />
</Provider>
);
注意:这里使用了 React 18 的 createRoot
API 来替代旧的 ReactDOM.render
。
5. 在组件中使用 Redux
使用 useSelector
和 useDispatch
hooks 来访问状态和分发 action。例如:
// src/components/Counter.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement } from '../features/counterSlice';
function Counter() {
const count = useSelector((state) => state.counter.value);
const dispatch = useDispatch();
return (
<div>
<h1>计数器: {count}</h1>
<button onClick={() => dispatch(increment())}>加 1</button>
<button onClick={() => dispatch(decrement())}>减 1</button>
</div>
);
}
export default Counter;
6. React 18 的注意事项
- 并发渲染兼容性:React 18 的并发特性(比如
useTransition
或startTransition
)不会直接影响 Redux,但如果你在组件中大量使用 Redux 状态更新,建议确保你的 reducer 是纯函数,避免副作用。 - 性能优化:如果你的组件因状态变化频繁重渲染,可以结合
useSelector
的第二个参数(比较函数)或 Redux Toolkit 的createSelector
来优化选择器。 - 异步操作:对于异步逻辑(如 API 调用),推荐使用
@reduxjs/toolkit
的createAsyncThunk
:
import { createAsyncThunk } from '@reduxjs/toolkit';
export const fetchData = createAsyncThunk('counter/fetchData', async () => {
const response = await fetch('https://api.example.com/data');
return response.json();
});
然后在 createSlice
中处理异步状态:
const counterSlice = createSlice({
name: 'counter',
initialState: {
value: 0,
data: null,
},
extraReducers: (builder) => {
builder.addCase(fetchData.fulfilled, (state, action) => {
state.data = action.payload;
});
},
});
总结
React 18 与 Redux 的结合主要依赖 @reduxjs/toolkit
和 react-redux
。通过 configureStore
创建 store,用 Provider
提供给组件树,然后在组件中使用 hooks(如 useSelector
和 useDispatch
)来操作状态。React 18 的新特性不会直接改变 Redux 的用法,但你可以利用这些特性(如并发渲染)来提升应用的性能和用户体验。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~