荣耀商城官网网站建设项目自主验收公示网站

张小明 2026/1/6 15:36:51
荣耀商城官网网站,建设项目自主验收公示网站,徐州网站建设的特点,网站备案后要做什么在 Vue 项目开发中#xff0c;Vuex 作为官方状态管理库#xff0c;是处理组件间共享数据的核心工具。但随着项目规模扩大#xff0c;单一的 Vuex Store 会变得臃肿不堪#xff0c;难以维护。本文将深入讲解 Vuex 的三大进阶技巧 ——Module 模块化、命名空间#xff08;Na…在 Vue 项目开发中Vuex 作为官方状态管理库是处理组件间共享数据的核心工具。但随着项目规模扩大单一的 Vuex Store 会变得臃肿不堪难以维护。本文将深入讲解 Vuex 的三大进阶技巧 ——Module 模块化、命名空间Namespaced与数据持久化帮助你构建清晰、可扩展且稳定的状态管理体系。一、为什么需要 Module 模块化当项目仅有几个简单的共享状态时直接在store/index.js中定义state、mutations、actions、getters是可行的。但在中大型项目中状态可能涉及用户、商品、购物车、订单等多个模块全部写在同一个文件里会导致代码冗余查找和修改状态逻辑成本高多人协作时容易出现命名冲突状态逻辑耦合严重不利于复用和测试。Vuex 的 Module模块化正是为解决这一问题而生 —— 它允许我们将 Store 拆分为多个独立的模块每个模块拥有自己的state、mutations、actions、getters最终通过modules选项整合到根 Store 中。1. 基础 Module 使用步骤 1定义模块文件按业务维度拆分模块例如创建store/modules/user.js用户模块和store/modules/cart.js购物车模块// store/modules/user.js export default { // 模块内部状态 state: () ({ token: , userInfo: {} }), // 同步修改状态 mutations: { SET_TOKEN(state, token) { state.token token }, SET_USER_INFO(state, info) { state.userInfo info } }, // 异步操作 actions: { login({ commit }, userData) { // 模拟登录请求 return new Promise(resolve { setTimeout(() { commit(SET_TOKEN, fake-token-123456) commit(SET_USER_INFO, { name: 张三, id: 1001 }) resolve() }, 1000) }) } }, // 派生状态 getters: { isLogin: state !!state.token } } // store/modules/cart.js export default { state: () ({ goodsList: [], totalPrice: 0 }), mutations: { ADD_GOODS(state, goods) { state.goodsList.push(goods) state.totalPrice goods.price * goods.count } }, actions: { addCart({ commit }, goods) { commit(ADD_GOODS, goods) } } }步骤 2整合模块到根 Store在store/index.js中引入并注册模块// store/index.js import Vue from vue import Vuex from vuex import user from ./modules/user import cart from ./modules/cart Vue.use(Vuex) export default new Vuex.Store({ // 注册模块 modules: { user, cart } })步骤 3组件中使用模块状态默认情况下模块的state是嵌套的需通过模块名访问而mutations、actions、getters仍注册在全局命名空间可直接调用template div div用户名{{ $store.state.user.userInfo.name }}/div div是否登录{{ $store.getters.isLogin }}/div button clickhandleLogin登录/button button clickhandleAddCart添加商品到购物车/button /div /template script export default { methods: { async handleLogin() { await this.$store.dispatch(login) console.log(登录成功) }, handleAddCart() { this.$store.commit(ADD_GOODS, { name: Vue实战, price: 59, count: 1 }) } } } /script二、命名空间Namespaced解决模块冲突上述基础模块存在一个问题多个模块的mutations/actions/getters若重名会互相覆盖因为默认注册到全局。Vuex 提供namespaced: true开启命名空间让模块的所有方法和属性都限定在自身命名空间内彻底解决冲突。1. 开启命名空间修改模块文件添加namespaced: true// store/modules/user.js export default { namespaced: true, // 开启命名空间 state: () ({ /* ... */ }), mutations: { /* ... */ }, actions: { /* ... */ }, getters: { /* ... */ } } // store/modules/cart.js export default { namespaced: true, state: () ({ /* ... */ }), mutations: { /* ... */ }, actions: { /* ... */ } }2. 命名空间下的状态调用开启命名空间后调用模块的mutations/actions/getters需指定模块路径方式 1直接通过 $store 调用script export default { methods: { async handleLogin() { // 命名空间下的action模块名/action名 await this.$store.dispatch(user/login) }, handleAddCart() { // 命名空间下的mutation模块名/mutation名 this.$store.commit(cart/ADD_GOODS, { name: Vue实战, price: 59, count: 1 }) } }, computed: { isLogin() { // 命名空间下的getters模块名/getter名 return this.$store.getters[user/isLogin] }, userName() { // state仍通过模块名访问不受命名空间影响 return this.$store.state.user.userInfo.name } } } /script方式 2通过 map 辅助函数推荐Vuex 提供mapState、mapMutations、mapActions、mapGetters辅助函数结合命名空间使用更简洁template div div用户名{{ userName }}/div div是否登录{{ isLogin }}/div button clicklogin登录/button button clickADD_GOODS({ name: Vue实战, price: 59, count: 1 })添加商品/button /div /template script import { mapState, mapGetters, mapActions, mapMutations } from vuex export default { computed: { // 映射user模块的state ...mapState(user, [userInfo]), userName() { return this.userInfo.name }, // 映射user模块的getters ...mapGetters(user, [isLogin]) }, methods: { // 映射user模块的actions ...mapActions(user, [login]), // 映射cart模块的mutations ...mapMutations(cart, [ADD_GOODS]) } } /script3. 模块间通信开启命名空间后模块内部若需调用其他模块的方法可通过{ root: true }指定根命名空间// store/modules/cart.js actions: { // 购物车结算需先校验用户是否登录调用user模块的getters checkout({ commit, rootGetters, dispatch }) { // 访问根getters跨模块 if (!rootGetters[user/isLogin]) { // 调用user模块的action跨模块 return dispatch(user/login, null, { root: true }) } // 结算逻辑 console.log(结算购物车) } }三、数据持久化解决页面刷新状态丢失Vuex 的状态存储在内存中页面刷新F5或浏览器重启后所有状态都会丢失这在实际项目中是不可接受的例如用户登录状态、购物车数据。解决这一问题的核心思路是将 Vuex 的核心状态同步到本地存储localStorage/sessionStorage页面初始化时再从本地存储恢复到 Vuex。1. 手动实现持久化简单场景适用于少量状态的持久化直接在mutations中同步本地存储// store/modules/user.js export default { namespaced: true, state: () ({ token: localStorage.getItem(token) || , // 初始化时从本地读取 userInfo: JSON.parse(localStorage.getItem(userInfo)) || {} }), mutations: { SET_TOKEN(state, token) { state.token token localStorage.setItem(token, token) // 同步到本地存储 }, SET_USER_INFO(state, info) { state.userInfo info localStorage.setItem(userInfo, JSON.stringify(info)) }, LOGOUT(state) { state.token state.userInfo {} localStorage.removeItem(token) localStorage.removeItem(userInfo) } } }2. 插件实现复杂场景推荐手动实现需逐个 mutation 添加存储逻辑效率低且易遗漏。推荐使用成熟的 Vuex 持久化插件vuex-persistedstate可批量配置需要持久化的模块和存储方式。步骤 1安装插件npm install vuex-persistedstate --save # 或 yarn add vuex-persistedstate步骤 2配置插件到根 Store// store/index.js import Vue from vue import Vuex from vuex import createPersistedState from vuex-persistedstate import user from ./modules/user import cart from ./modules/cart Vue.use(Vuex) export default new Vuex.Store({ modules: { user, cart }, plugins: [ createPersistedState({ // 配置项 key: vuex-store, // 本地存储的key名默认是vuex storage: window.localStorage, // 存储方式localStorage/sessionStorage默认localStorage paths: [user, cart] // 需要持久化的模块不配置则全部持久化 // 可选过滤需要持久化的状态例如只持久化user的token和cart的goodsList // reducer: (state) ({ // user: { token: state.user.token }, // cart: { goodsList: state.cart.goodsList } // }) }) ] })插件核心优势无需修改现有模块代码一键实现状态持久化支持自定义存储方式如 sessionStorage、甚至 cookie支持精准配置需要持久化的模块 / 状态减少本地存储体积自动处理序列化 / 反序列化无需手动 JSON.parse/stringify。3. 注意事项敏感数据如 token建议加密后再存储避免本地存储被窃取不要持久化过大的状态如商品列表会增加本地存储压力可结合接口缓存sessionStorage 仅在当前会话有效关闭浏览器后丢失适合临时状态localStorage 永久存储需手动清理。四、最佳实践总结模块拆分原则按业务域用户、购物车、订单拆分每个模块职责单一命名空间必开无论模块是否重名都建议开启namespaced: true避免后续扩展冲突辅助函数使用优先使用mapState/mapActions等辅助函数简化组件代码持久化按需配置仅持久化核心状态如登录态、购物车非核心状态如临时列表无需持久化模块复用可将通用模块如权限、设置抽离为独立文件在多项目中复用调试技巧使用 Vue Devtools 的 Vuex 面板可直观查看模块状态、追踪 mutation/action 调用。五、总结Vuex 的 Module 模块化让状态管理更清晰命名空间解决了模块冲突问题数据持久化则保证了状态的稳定性。三者结合能让 Vue 项目的状态管理体系更健壮、可维护尤其适合中大型项目。在实际开发中需根据项目规模灵活调整方案 —— 小型项目可简化模块拆分大型项目则需严格遵循模块化和命名空间规范同时合理配置数据持久化策略。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

安徽太和有没有做网站的合肥网页制作培训

Update4j:构建Java应用自动更新的终极指南 【免费下载链接】update4j Create your own auto-update framework 项目地址: https://gitcode.com/gh_mirrors/up/update4j 在当今快速迭代的软件开发环境中,保持应用程序的最新状态是提升用户体验的关…

张小明 2026/1/6 15:36:18 网站建设

网站地图生成软件摄影设计师招聘

Qwen3-VL品牌标识检测:社交媒体侵权监控解决方案 在今天的数字世界里,一条带有品牌LOGO的图片或短视频,可能在几分钟内被转发上万次。这种传播速度让品牌的影响力空前扩大,但也带来了一个棘手的问题:如何区分善意分享与…

张小明 2026/1/6 15:35:43 网站建设

东莞阳光网站官网做qq链接的网站

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个最小化Anaconda3快速启动工具,功能包括:1.核心组件选择性安装 2.极简开发环境配置 3.常用开发模板快速生成 4.一键运行验证 5.临时环境管理 6.快速卸…

张小明 2026/1/6 15:35:09 网站建设

美容手机网站模板看摄影作品的网站

智能微信聊天机器人:让AI成为你的贴心聊天伙伴 【免费下载链接】WeChatBot_WXAUTO_SE 将deepseek接入微信实现自动聊天的聊天机器人。本项目通过wxauto实现收发微信消息。原项目仓库:https://github.com/umaru-233/My-Dream-Moments 本项目由iwyxdxl在原…

张小明 2026/1/6 15:34:34 网站建设

妙趣网 通辽网站建设wordpress 排序插件

Elasticsearch缓存、断路器与集群发现配置详解 1. 字段数据缓存 字段数据缓存并非简单功能,它旨在尽可能节省内存。Elasticsearch根据数据类型为字段数据缓存提供了几种格式,可通过在字段的 fielddata 对象中指定 format 属性来设置存储在字段数据缓存中的内部数据格式…

张小明 2026/1/6 15:33:58 网站建设

网站申请域名阳江房产网

三相三电平PWM整流器闭环控制策略,采用三电平SVPWM算法在电力电子领域,三相三电平PWM整流器一直是研究的热点,它在提高电能质量、降低谐波污染等方面有着出色的表现。而要让整流器稳定、高效地运行,闭环控制策略就显得尤为重要&am…

张小明 2026/1/6 15:33:21 网站建设