当前位置: 首页 > news >正文

Vue 项目在哪里加载「字典数据」最好

Vue 项目在哪里加载「字典数据」最好

1. 主要需求理解

目标: 进入网站(用户访问系统)时,刷新并缓存字典数据,供后续页面或组件使用。


2. 实现方案比较

方案实现位置优势注意事项
方案A全局入口 App.vue created()- 页面加载前获取
- 所有页面可用
- 需处理加载状态(避免白屏)
- 一般结合 Vuex 存储
方案BVuex store 中 action + 初始化调用- 与状态管理一致
- 便于模块拆分
- 需要在 App.vue 或路由守卫调用一次
方案C路由守卫 (router.beforeEach)- 访问每个页面可触发刷新
- 适合动态字典
- 每次跳转均请求,增加接口压力
方案D单个业务页面 created()- 仅当前页面使用- 其他页面需要重复请求,不适合全局字典
方案E服务端渲染时预取(Nuxt、SSR)- 首屏即返回字典数据- 仅适用于 SSR 项目

3. 最佳推荐方案

方案 A+B 组合(最佳实践)

① 在 store/modules/dictionary.js 中创建模块

// store/modules/dictionary.js
const state = {dictData: {}
};const mutations = {setDictData(state, data) {state.dictData = data;}
};const actions = {async fetchDictData({ commit }) {const res = await api.getDictionary(); // 替换为你的APIcommit('setDictData', res.data);}
};export default {namespaced: true,state,mutations,actions
};

② 在 App.vue 中 created() 调用一次

// App.vue
created() {this.$store.dispatch('dictionary/fetchDictData');
}

这样做的好处:

  • 进入网站时只请求一次
  • 全局可用,后续无需再次请求
  • 与 Vuex 结构一致,维护简单

4. 方案 C 的使用场景

如果 字典数据会频繁更新,可改为:

// router/index.js
router.beforeEach(async (to, from, next) => {await store.dispatch('dictionary/fetchDictData');next();
});

但通常 不建议每次路由切换都刷新,除非数据实时性要求极高。


5. 进阶优化

  • 缓存策略: 使用 localStorage/sessionStorage 缓存,减少请求次数
  • 过期策略: 设置时间戳,超过 N 分钟重新请求
  • 接口合并: 如果多个字典接口,可改为批量接口一次返回所有字典

6. 总结

最佳位置:App.vue created() 中调用 Vuex action 初始化字典数据
结合 Vuex 统一管理,避免重复请求
如对实时性要求高,可在路由守卫刷新,但需注意接口压力

7.实例

src/App.vue 文件中,找到 created() 生命周期方法

<script>
export default {created() {this.getDict(); // 初始化获取字典数据},methods: {// 获取字典async getDict() {const response = await this.$apiRequest('get', '/api/dictionary/list'); // 统一脱敏为 /api/dictionary/listif (response.status === 200) {const dictData = response?.data?.data || [];this.$store.dispatch('saveDictData', dictData); // 保存到 Vuex}},},
};
</script>
http://www.dtcms.com/a/265476.html

相关文章:

  • 基于 alpine 构建 .net 的基础镜像
  • 开源模型应用落地-让AI更懂你的每一次交互-Mem0集成Qdrant、Neo4j与Streamlit的创新实践(四)
  • Zookeeper 客户端 .net访问框架 ZookeeperNetEx项目开发编译
  • 开源 C# .net mvc 开发(六)特殊控制控制台、周期、邮件编程
  • 深度实战:Ubuntu服务器宕机排查全记录
  • 月付物理服务器租用平台-青蛙云
  • 基于 govaluate 的监控系统中,如何设计灵活可扩展的自定义表达式函数体系
  • npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree
  • Python Set() 完全指南:从入门到精通
  • R语言开发记录,一
  • 前端-HTML-day1
  • Rust Web 全栈开发(二):构建 HTTP Server
  • 主流分布式中间件及其选型
  • locate命令的原理是啥
  • OpenCV CUDA模块设备层-----在GPU 上高效地执行两个 uint 类型值的最大值比较函数vmax2()
  • Frida:配置自动补全 in VSCode
  • 搭建VirtualBox-6+vagrant_2+docker+mysql5.7的步骤
  • 客户案例 | 某新能源车企依托Atlassian工具链+龙智定制开发服务,打造符合ASPICE标准的研发管理体系
  • 云原生系统DOCKER中容器系统搭建
  • Python字符与ASCII转换方法
  • Ubuntu Gnome 安装和卸载 WhiteSur-gtk-theme 类 Mac 主题的正确方法
  • vue2+elementui使用compressorjs压缩上传的图片
  • Euler2203安装.NetCore6.0环境操作步骤
  • python安装虚拟环境
  • Python 物联网(IoT)与边缘计算开发实战(1)
  • 优雅草蜻蜓R实时音视频会议系统云原生私有化部署方案深度解析-优雅草卓伊凡|贝贝|clam|麻子|夜辰
  • Docker 容器资源限制
  • 9.Docker的容器数据卷使用(挂载)
  • ATE FT ChangeKit学习总结-20250630
  • 网络的封包与拆包