next 14 appRouter redux数据持久化

store/index.tsx

'use client'
import { ReactElement, memo } from 'react';
import { PersistGate } from 'reduxjs-toolkit-persist/integration/react';
import { combineReducers, configureStore } from '@reduxjs/toolkit';
import { persistReducer, persistStore, FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER } from 'reduxjs-toolkit-persist';
import { Provider } from 'react-redux';
import storage from 'reduxjs-toolkit-persist/lib/storage'
import autoMergeLevel1 from 'reduxjs-toolkit-persist/lib/stateReconciler/autoMergeLevel1';
import countReducer from './count';
import userReducer from './userInfo';
import tipReducer from './tip';

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

const reducers = combineReducers({
  countReducer,
  userReducer,
  tipReducer
});

const _persistedReducer = persistReducer(persistConfig, reducers as any);

export const store = configureStore({
  reducer: _persistedReducer,
  middleware: (getDefaultMiddleware) => getDefaultMiddleware({
    serializableCheck: {
      /* ignore persistance actions */
      ignoredActions: [
        FLUSH,
        REHYDRATE,
        PAUSE,
        PERSIST,
        PURGE,
        REGISTER
      ],
    },
  }),
});

let persistor = persistStore(store)

// function Providers(props: { children: ReactElement<any, any>; store: { userInfo: any; token: string; }; }) {
function Providers(props: { children: ReactElement<any, any>; }) {

  return (<>
    <Provider store={store}>
      <PersistGate loading={null} persistor={persistor}>
        {props.children}
      </PersistGate>
    </Provider>
  </>);
}

export default memo(Providers);

app/layout.tsx

import type { Metadata } from 'next';
import { ReactNode } from 'react';
import { Inter } from 'next/font/google';
import Providers from '@/store';
import './globals.css';
import Layout from '@/components/layout';

const inter = Inter({ subsets: ['latin'] })

export const metadata: Metadata = {
  title: 'Create Next App',
  description: 'Generated by create next app',
}

const RootLayout = ({ children, }: { children: ReactNode }) => {

  return (<>
    <html lang="en" className='bg-zinc-100'>
      <body className={inter.className}>
        {/* <Providers store={{ userInfo, token }}> */}
        <Providers>
          <Layout>{children}</Layout>
        </Providers>
      </body>
    </html>
  </>)
}

export default RootLayout;

export function reportWebVitals(mertic: any) {

  switch (mertic.name) {
    case 'FCP':
      console.log('FCP', mertic);
      break;
    case 'LCP':
      console.log('LCP', mertic);
      break;
    case 'CLS':
      console.log('CLS', mertic);
      break;
    case 'FID':
      console.log('FID', mertic);
      break;
    case 'TTFB':
      console.log('TTFB', mertic);
      break;
    default:
      break;
  }

}

package.json

{
  "name": "test2",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev -p 4000",
    "build": "next build",
    "start": "next start -p 4000",
    "lint": "next lint"
  },
  "dependencies": {
    "@reduxjs/toolkit": "^1.9.7",
    "@uiw/react-md-editor": "^4.0.2",
    "axios": "^1.6.5",
    "date-fns": "^3.1.0",
    "iron-session": "^8.0.1",
    "js-base64": "^3.7.5",
    "markdown-to-txt": "^2.0.1",
    "md5": "^2.3.0",
    "mockjs": "^1.1.0",
    "next": "^14.0.4",
    "react": "^18",
    "react-dom": "^18",
    "react-redux": "^8.0.2",
    "reduxjs-toolkit-persist": "^7.2.1",
    "sequelize": "^6.35.2",
    "autoprefixer": "^10.0.1",
    "mysql2": "^3.6.5",
    "uuid": "^9.0.1"
  },
  "devDependencies": {
    "@types/js-base64": "^3.3.1",
    "@types/uuid": "^9.0.7",
    "@types/md5": "^2.3.5",
    "@types/mockjs": "^1.0.10",
    "@types/node": "^20",
    "@types/react": "^18",
    "@types/react-dom": "^18",
    "@types/sequelize": "^4.28.19",
    "eslint": "^8",
    "eslint-config-next": "14.0.4",
    "postcss": "^8",
    "sass": "^1.69.7",
    "tailwindcss": "^3.3.0",
    "typescript": "^5"
  },
  "browserslist": [
    "chrome 64",
    "edge 79",
    "firefox 67",
    "opera 51",
    "safari 12"
  ]
}

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值