多租户系统中Vuex状态需按租户物理隔离与逻辑分层,动态注册/卸载命名空间模块(如tenant_123_user),私有态(token、菜单等)隔离,共享态(字典、公告等)抽为namespaced的common模块,切换租户时清理敏感态并重置上下文,通信须显式传参租户ID。

多租户系统中,Vuex 的全局状态不能“一锅炖”,必须按租户维度做物理隔离 + 逻辑分层,否则 token 混用、菜单错乱、缓存污染等问题会立刻出现。核心不是把所有状态塞进 store,而是让每个租户拥有独立的运行上下文。
按租户动态注册/卸载模块
避免共用一个 user 或 tenant 模块。应为每个租户生成带命名空间的独立模块实例,例如:tenant_123_user、tenant_456_menu。
- 登录成功后,调用
store.registerModule(`tenant_${tenantId}`, tenantModule)动态挂载 - 切换租户前,先执行
store.unregisterModule(`tenant_${oldId}`)清理旧模块(含 state、mutations、actions) - 模块工厂函数返回完整模块定义,确保每次创建都是干净实例,不共享闭包变量
共享态与私有态分层存放
不是所有状态都要隔离。混在一起既浪费内存,又增加同步复杂度。
Vue 3 组合式 API 与 最佳实践,涵盖代码组织、useXxx 模式、组合式函数设计、Store 集成、响应式优化及功能抽取。
- 必须隔离的私有态:当前租户的 token、用户基本信息、权限列表、个性化菜单配置、未提交草稿
- 可复用的共享态:系统级字典(如省份列表)、公告 banner、静态资源 URL、字体包、通用工具函数
- 共享态建议抽成独立模块(如
common),启用namespaced: true避免命名冲突,且禁止写操作
租户上下文透传与状态重建
切换租户时,不拷贝整个 state,而是清空敏感字段 + 按需拉取新数据。
立即学习“前端免费学习笔记(深入)”;
- 前端用
sessionStorage或localStorage持久化当前租户 ID,刷新后自动恢复上下文 - 切换时重置认证相关模块(清除 token、清空 user state),再触发
loadTenantData({ tenantId })action - 菜单、路由等依赖权限的数据,通过后端接口按租户返回,不复用上一个租户的缓存结果
通信走契约,禁用跨租户直连
任何模块都不能假设“当前租户是谁”,所有租户感知逻辑必须显式传参。
- 封装
useTenantContext()组合式函数或getCurrentTenant()工具方法,统一提供租户 ID 和基础信息 - API 请求拦截器自动注入
tenant_id请求头,后端据此做行级过滤 - 跨租户操作(如超管查看其他租户数据)必须显式调用
fetchTenantData({ tenantId: 'xxx' }),不复用当前模块的 action

















