joken-前端工程师

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::
  404 随笔 :: 39 文章 :: 8 评论 :: 20万 阅读

在 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/toolkitconfigureStore 来创建 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/toolkitcreateSlice 来定义 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.jsApp.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

使用 useSelectoruseDispatch 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 的并发特性(比如 useTransitionstartTransition)不会直接影响 Redux,但如果你在组件中大量使用 Redux 状态更新,建议确保你的 reducer 是纯函数,避免副作用。
  • 性能优化:如果你的组件因状态变化频繁重渲染,可以结合 useSelector 的第二个参数(比较函数)或 Redux Toolkit 的 createSelector 来优化选择器。
  • 异步操作:对于异步逻辑(如 API 调用),推荐使用 @reduxjs/toolkitcreateAsyncThunk
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/toolkitreact-redux。通过 configureStore 创建 store,用 Provider 提供给组件树,然后在组件中使用 hooks(如 useSelectoruseDispatch)来操作状态。React 18 的新特性不会直接改变 Redux 的用法,但你可以利用这些特性(如并发渲染)来提升应用的性能和用户体验。

posted on   joken1310  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示