XinAdmin 前端采用 Zustand 作为状态管理库,它是一个轻量级、简单且功能强大的状态管理解决方案。相比 Redux,Zustand 具有更少的模板代码和更直观的 API 设计,非常适合现代项目的状态管理需求。
Zustand 是一个德语单词,意思是 "state"(状态)。它的设计哲学是提供最小但完整的状态管理解决方案,具有以下特点:
Zustand 使用 set 函数来更新状态,该函数接收一个新的状态对象或一个函数,该函数接收当前状态并返回新的状态。这种方式类似于 React 的 useState Hook。
Zustand 支持中间件来扩展功能,XinAdmin 项目中使用了以下中间件:
devtools:为开发工具提供时间旅行和记录功能persist:状态持久化到本地存储createJSONStorage:指定存储方式(localStorage/sessionStorage)XinAdmin 采用切片模式(Slice Pattern)组织状态管理,将不同功能领域的状态分别管理,并最终合并成统一的 Store。主要包含两个核心 Store:useAuthStore 和 useGlobalStore。
认证状态管理负责用户认证相关的所有状态,包括用户信息、菜单、权限等。
用户状态 (UserState):存储当前登录用户信息和权限列表
user:当前登录用户对象access:用户权限列表菜单状态 (MenuState):管理导航菜单和面包屑
menus:完整菜单数组menuMap:菜单映射,用于快速查找菜单项breadcrumbMap:面包屑映射localRoute:是否使用本地路由认证状态 (AuthenticationState):认证初始化状态
initialized:应用是否已初始化login(credentials):用户登录,存储 token 到 localStoragelogout():用户登出,清理本地状态getInfo():获取用户信息和菜单initApp():应用初始化isAuthenticated():检查是否已认证setAccess(access):设置用户权限setMenus(menus):设置菜单数据setLocalRoute(isLocal):设置是否使用本地路由只有 localRoute 字段被持久化到 localStorage,敏感数据如 token 直接存储在 localStorage 中而非 Store 中。
全局状态管理负责整个应用的全局配置,包括网站信息、布局、主题等。
网站信息状态 (SiteState):网站基础信息
logo:网站 Logotitle:网站标题subtitle:网站副标题describe:网站描述documentTitle:文档标题布局状态 (LayoutState):页面布局相关配置
layout:布局类型(side/mix/columns)collapsed:侧边栏折叠状态isMobile:是否移动端mobileMenuOpen:移动端菜单打开状态breadcrumb:当前面包屑menuParentKey:当前父级菜单键主题状态 (ThemeState):主题配置
themeConfig:主题配置对象themeDrawer:主题抽屉打开状态网站信息操作
initWebInfo():初始化网站信息setDocumentTitle(title):设置文档标题布局操作
setLayout(layout):设置布局类型setCollapsed(collapsed):设置侧边栏折叠状态setIsMobile(isMobile):设置移动端状态setMobileMenuOpen(mobileMenuOpen):设置移动端菜单状态setBreadcrumb(breadcrumb):设置面包屑setMenuParentKey(menuParentKey):设置父级菜单键主题操作
setThemeConfig(themeConfig):设置主题配置setThemeDrawer(themeDrawer):设置主题抽屉状态以下字段被持久化到 localStorage:
注意:临时性状态如 mobileMenuOpen、themeDrawer、breadcrumb 等不会被持久化。
XinAdmin 使用切片模式组织状态,每个功能模块有自己的 slice,然后通过组合创建完整的 store。这样可以提高代码的可维护性和模块化程度。
XinAdmin 充分利用 TypeScript 的类型系统,为所有状态和方法定义明确的接口,确保类型安全。
每个 slice 都有对应的初始状态,在需要重置或测试时非常有用。
在组件中使用状态时,建议只订阅需要的部分,避免不必要的重渲染。