Skip to content

使用 redux

在 Next.js 应用中使用 Redux 可以帮助你更有效地管理应用的状态。由于 Next.js 支持服务端渲染(SSR),所以在设置 Redux 时需要考虑如何在客户端和服务器端之间共享状态。以下是如何在 Next.js 中集成 Redux 的步骤:

步骤 1: 安装 Redux 和相关依赖

首先,你需要安装 Redux、React-Redux 以及 redux-thunk(如果你想使用异步动作的话)。

bash
npm install redux react-redux @reduxjs/toolkit
# 或者使用 Yarn
yarn add redux react-redux @reduxjs/toolkit

步骤 2: 创建 Redux Store

推荐使用 @reduxjs/toolkit 来创建你的 store,因为它简化了 Redux 的配置过程,并提供了诸如 reducer 组合等功能。

创建一个名为 store.js 的文件(例如在 store 目录下)来配置你的 Redux store。

javascript
// store/store.js
import { configureStore } from "@reduxjs/toolkit";
import postsReducer from "./postsSlice"; // 假设我们有一个用于管理文章的reducer

export const store = configureStore({
  reducer: {
    posts: postsReducer,
  },
});

export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;

这里我们创建了一个简单的 Redux store,并添加了一个 postsReducer 来管理文章相关的状态。

步骤 3: 提供 Store 到 React 应用

为了让 React 组件能够访问到 Redux store,我们需要使用 Provider 组件包裹我们的应用根组件。由于 Next.js 使用 _app.js 文件作为全局布局,因此这是一个理想的放置位置。

javascript
// pages/_app.js
import { Provider } from "react-redux";
import { store } from "../store/store";

function MyApp({ Component, pageProps }) {
  return (
    <Provider store={store}>
      <Component {...pageProps} />
    </Provider>
  );
}

export default MyApp;

步骤 4: 在服务端渲染时提供 Store

为了确保服务端渲染(SSR)也能正确地使用 Redux store,我们需要在每个请求到达时创建一个新的 store 实例。这可以通过自定义 _app.js 中的 getInitialProps 方法实现。

javascript
// pages/_app.js
import { Provider } from "react-redux";
import { store } from "../store/store";
import { useStore } from "react-redux";
import { useMemo } from "react";

function MyApp({ Component, pageProps }) {
  const store = useStore((state) => state);

  return (
    <Provider store={store}>
      <Component {...pageProps} />
    </Provider>
  );
}

MyApp.getInitialProps = async (appContext) => {
  const reduxStore = configureStore({
    reducer: {
      posts: postsReducer,
    },
  });
  appContext.ctx.reduxStore = reduxStore;

  let appProps = {};
  if (typeof appContext.Component.getInitialProps === "function") {
    appProps = await appContext.Component.getInitialProps(appContext.ctx);
  }

  return {
    ...appProps,
    initialReduxState: reduxStore.getState(),
  };
};

export default MyApp;

请注意,上面的例子只是一个简化的示例,实际应用中可能需要根据具体情况调整。

步骤 5: 使用 Redux 在组件中

现在,你可以在任何 React 组件中使用 Redux 来获取或更新状态。

javascript
import React from "react";
import { useSelector, useDispatch } from "react-redux";
import { fetchPosts } from "../store/postsSlice";

function Posts() {
  const dispatch = useDispatch();
  const posts = useSelector((state) => state.posts.items);

  React.useEffect(() => {
    dispatch(fetchPosts());
  }, [dispatch]);

  return (
    <div>
      {posts.map((post) => (
        <div key={post.id}>{post.title}</div>
      ))}
    </div>
  );
}

export default Posts;

通过这些步骤,你就可以在 Next.js 应用中成功集成 Redux,从而更好地管理和维护应用状态。无论是简单的状态管理还是复杂的异步操作,Redux 都能为你提供强大的支持。

Released under the MIT License.