簡體   English   中英

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

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

我正在嘗試使用 next-redux-wrapper 添加 redux-persist 和 next.js,但存儲沒有更新,state 在頁面刷新期間丟失,

這是我的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);

這是我的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;

還有我的_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);

是否需要在 reducer 文件中提交persist/REHYDRATE操作?我正在檢查persist/REHYDRATE操作,但該操作的負載未定義。

我找到了解決方案,這是我的 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);

這是我的 _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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM