简体   繁体   English

使用 redux-persist 和 next-redux-wrapper (Typescript) 不更新存储

[英]storage is not being update using redux-persist with next-redux-wrapper (Typescript)

I am trying to add redux-persist with next.js using next-redux-wrapper, but storage is not updating, state is lost during page refresh,我正在尝试使用 next-redux-wrapper 添加 redux-persist 和 next.js,但存储没有更新,state 在页面刷新期间丢失,

Here is my store.ts file:-这是我的store.ts文件:-

import { createStore, applyMiddleware } from 'redux';
import { createWrapper } from 'next-redux-wrapper';
import storage from 'redux-persist/lib/storage';
import rootReducer from './rootReducer';
import { createLogger } from 'redux-logger'
import { persistStore, persistReducer } from 'redux-persist';
import { composeWithDevTools } from 'redux-devtools-extension';


const logger = createLogger();


// BINDING MIDDLEWARE
const bindMiddleware = (middleware) => {
    if (process.env.NODE_ENV !== 'production') {

        return composeWithDevTools(applyMiddleware(...middleware));
    }
    return applyMiddleware(...middleware);
};

const makeStore: any = ({ isServer }) => {
    if (isServer) {
        //If it's on server side, create a store
        return createStore(rootReducer, bindMiddleware([logger]));
    } else {
        //If it's on client side, create a store which will persist


        const persistConfig = {
            key: 'root',
            storage,
        };

        const persistedReducer = persistReducer(persistConfig, rootReducer);

        const store: any = createStore(
            persistedReducer,
            bindMiddleware([logger])
        );



        store.__persistor = persistStore(store);
        return store;
    }
};


export const wrapper = createWrapper(makeStore);

Here is my reducer.ts file:-这是我的reducer.ts文件:-

import {
    LOGOUT,
    LOGIN_ERROR,
    LOGIN_SUCCESS,
} from "./actionTypes";


const initialState = {
    userInfo: null,
    accessToken: null,
    loginError: false,
    loading: true,
    isLoggedIn: false
};



const authReducer = (state: any = initialState, action: any) => {

    switch (action.type) {

        case LOGIN_SUCCESS:
            state = {
                ...state,
                userInfo: action.payload.userInfo,
                accessToken: action.payload.accessToken,
                loading: false,
                isLoggedIn: true
            }
            break;
        case LOGIN_ERROR:

            state = {
                ...state
            }
            break;
        case LOGOUT:

            state = {
                ...state,
                userInfo: null,
                accessToken: null,
                loginError: false,
                loading: false,
                isLoggedIn: false
            }

            console.log(state);
            break;
        default:
            state = {
                ...state,
            };
            break;
    }


    return state;
};

export default authReducer;

And my _app.tsx file:-还有我的_app.tsx文件:-

import type { AppProps } from "next/app";
import "../styles/reset.scss";
import Layout from "@/components/layout";
import { wrapper } from "../src/redux/store"
import { useStore } from "react-redux"
import { PersistGate } from "redux-persist/integration/react";
import { ApolloProvider } from "@apollo/client";
import { useApollo } from "../src/graphql/apollo/apollo";
import Loader from '@/components/Loader'



function MyApp({ Component, pageProps }: AppProps) {
  const apolloClient = useApollo(pageProps.initialApolloState);
  const store: any = useStore();
  return (
    <ApolloProvider client={apolloClient}>
      <PersistGate persistor={store.__persistor} loading={<div>Loading</div>}>
        <Layout>
          <Loader />
          <Component {...pageProps} />
        </Layout>
      </PersistGate>
    </ApolloProvider>
  );
}

export default wrapper.withRedux(MyApp);

Is there need to hand persist/REHYDRATE action in reducer file?, I am checking the persist/REHYDRATE action but payload is undefined on that action.是否需要在 reducer 文件中提交persist/REHYDRATE操作?我正在检查persist/REHYDRATE操作,但该操作的负载未定义。

I found the solution, Here is my store.ts file我找到了解决方案,这是我的 store.ts 文件

import { createStore, applyMiddleware } from 'redux';
import { createWrapper } from 'next-redux-wrapper';
import storage from 'redux-persist/lib/storage';
import rootReducer from './rootReducer';
import rootSaga from './rootSaga'
import { createLogger } from 'redux-logger'
import { persistStore, persistReducer } from 'redux-persist';
import { composeWithDevTools } from 'redux-devtools-extension';
import createSagaMiddleware from "redux-saga";


const logger = createLogger();
const sagaMiddleware = createSagaMiddleware();


// BINDING MIDDLEWARE
const bindMiddleware = (middleware) => {
    if (process.env.NODE_ENV !== 'production') {

        return composeWithDevTools(applyMiddleware(...middleware));
    }
    return applyMiddleware(...middleware);
};

const makeStore: any = ({ isServer }) => {
    if (isServer) {
        //If it's on server side, create a store
        return createStore(rootReducer, bindMiddleware([logger]));
        // return createStore(rootReducer, bindMiddleware([]));
    } else {
        //If it's on client side, create a store which will persist

        const persistConfig = {
            key: 'root',
            storage,
        };

        const persistedReducer = persistReducer(persistConfig, rootReducer);

        const store: any = createStore(
            persistedReducer,
            bindMiddleware([logger, sagaMiddleware])
            // bindMiddleware([sagaMiddleware])
        );
        store.__persistor = persistStore(store);
        sagaMiddleware.run(rootSaga);
        return store;
    }
};

export const wrapper = createWrapper(makeStore);

and here is my _app.tsx file:-这是我的 _app.tsx 文件:-

import type { AppProps } from "next/app";
import "../styles/reset.scss";
import Layout from "@/components/layout";
import { wrapper } from "@/redux/store";
import { useStore } from "react-redux";
import { PersistGate } from "redux-persist/integration/react";
import { ApolloProvider } from "@apollo/client";
import { useApollo } from "@/graphql/apollo/apollo";
import Head from "next/head";
import SimpleReactLightbox from "simple-react-lightbox";

function MyApp({ Component, pageProps }: AppProps) {
  const apolloClient = useApollo(pageProps.initialApolloState);
  const store: any = useStore();

  

  return (
   
    <ApolloProvider client={apolloClient}>
      <PersistGate persistor={store.__persistor} loading={null}>
        <SimpleReactLightbox>
          <Layout>
           
            <Head>
              <meta
                name="viewport"
                content="width=device-width, initial-scale=1.0, maximum-scale=1.0"
              />
            </Head>
            <Component {...pageProps} />
          </Layout>
        </SimpleReactLightbox>
      </PersistGate>
    </ApolloProvider>
  
  );
}

export default wrapper.withRedux(MyApp);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Next.js:getServerSideProps 无法使用 Next.js 和 Next-redux-wrapper 以及 TypeScript - Next.js: getServerSideProps not working using Next.js with Next-redux-wrapper with TypeScript 如何使用 typescript、next-redux-wrapper、getServerSideProps? - how to use typescript, next-redux-wrapper, getServerSideProps? 如何正确使用带有“Next.js”、“Redux-ToolKit”和 Typescript 的“next-redux-wrapper”? - How to use "next-redux-wrapper" with "Next.js", "Redux-ToolKit" and Typescript properly? Redux 工具包 typescript 类型问题与 next js 和 next-redux-wrapper - Redux toolkit typescript type issue with next js and next-redux-wrapper nextjs 中 getServerSideProps 中的 next-redux-wrapper - next-redux-wrapper in getServerSideProps in nextjs Next.js:使用带有 TypeScript 的 next-redux-wrapper 在 getServerSideProps 中调用 Thunks? - Next.js: Calling Thunks in getServerSideProps with next-redux-wrapper with TypeScript? 打字稿类型的redux-persist MigrationManifest? - Typescript-typed redux-persist MigrationManifest? 如何将 redux-persist 添加到 typescript 项目? - How to add redux-persist to typescript project? 在实现 Redux-Persist 时使用 AnyAction 反应 Redux Typescript 错误 - React Redux Typescript error with AnyAction when implementing Redux-Persist 如何在 redux 工具包中编写 redux-persist 以及 TypeScript - How to write redux-persist in redux toolkit along with TypeScript
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM