希曼日记

Redux Toolkit 浏览器本地缓存

本页目录 3
  1. 核心
  2. 格式
  3. 示例

核心

利用Redux Toolkit内置的subscribe订阅函数来监听configureStorereducer对象的变化, 如果状态发生改变,那么就存储到浏览器的存储(localStorage本地存储 or sessionStorage会话存储)

格式

store总配置文件index

import { configureStore } from '@reduxjs/toolkit'
import { ToolkitStore } from '@reduxjs/toolkit/dist/configureStore'

const reducers: ReducersType = {}

export const store: ToolkitStore = configureStore({
	reducer: reducers,
})

// 状态变化时自动存储到浏览器本地存储,实现刷新时状态不丢失
store.subscribe(() => {
	const state = store.getState()
	localStorage.setItem('state', JSON.stringify(state))
})

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

slice

import type { PayloadAction } from '@reduxjs/toolkit'
import { createSlice } from '@reduxjs/toolkit'

const initialValue: { value: Users } = {
	value: {},
}

const cache = localStorage.getItem('state') || initialValue
const initialState = typeof cache === 'string' ? JSON.parse(cache).profile : cache

export const profileSlice = createSlice({
	name: 'profile',
	initialState,
	reducers: {}
})

export default profileSlice.reducer

示例

store总配置文件

import { configureStore } from '@reduxjs/toolkit'
import { ToolkitStore } from '@reduxjs/toolkit/dist/configureStore'

import messageReducer from '@/features/im/message'
import roomReducer from '@/features/im/room'
import themeReducer from '@/features/theme/mode'
import profileReducer from '@/features/user/profile'
import specialtyReducer from '@/features/user/specialty'
import type { ReducersType } from '@/type'


const reducers: ReducersType = {
	profile: profileReducer,
	room: roomReducer,
	message: messageReducer,
	specialty: specialtyReducer,
	theme: themeReducer,
}

export const store: ToolkitStore = configureStore({
	reducer: reducers,
})

// 状态变化时自动存储到浏览器本地存储,实现刷新时状态不丢失
store.subscribe(() => {
	const state = store.getState()
	localStorage.setItem('state', JSON.stringify(state))
})

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

用户状态 feat/user/profile

import type { PayloadAction } from '@reduxjs/toolkit'
import { createSlice } from '@reduxjs/toolkit'

import type { Users } from '@/type'


const initialValue: { value: Users } = {
	value: {
		role: '',
		account: '',
		username: '',
		avatar: '',
		createdTime: new Date().getTime(),
		updatedTime: new Date().getTime(),
	},
}

const cache = localStorage.getItem('state') || initialValue
const initialState = typeof cache === 'string' ? JSON.parse(cache).profile : cache
export const profileSlice = createSlice({
	name: 'profile',
	initialState,
	reducers: {
		/**
		 * @description 更新个人信息
		 * @since 15/12/2022下午7:12
		 * @param state 状态
		 * @param payload { Users } 修改的内容
		 * @return 更新initialState的全部内容
		 *  */
		updateUserInfo: (state, {payload}: PayloadAction<Users>) => {
			state.value = {...payload}
		},
		/**
		 * @description 替换role内容
		 * @since 15/12/2022下午7:13
		 * @param state 状态
		 * @param payload string  角色权限
		 * @return 更新角色权限
		 *  */
		toggleRole: (state, {payload}: PayloadAction<string>) => {
			state.value.role = payload
		},
	},
})

// Action creators are generated for each case reducer function
export const {updateUserInfo, toggleRole} = profileSlice.actions

export default profileSlice.reducer