news 2026/5/8 16:54:51

Vuex4:专为 Vue 3 设计,提供完整 TypeScript 支持

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vuex4:专为 Vue 3 设计,提供完整 TypeScript 支持

Vuex4中组件与Store交互方式对比:

  • Options API通过mapState/mapGetters/mapMutations/mapActions等辅助函数或this.$store直接访问;
  • Composition API则统一使用useStore获取实例,配合computed/watch实现响应式访问。

关键区别在于:

  • Options API自动处理响应式,按选项组织代码;
  • Composition API需手动包装状态,按功能逻辑组织代码。

Mutation必须同步修改状态,Action可包含异步操作,Getter用于派生计算属性。


Vuex4专为Vue3设计,提供完整TypeScript支持,模块系统通过命名空间管理状态隔离。


两种API风格都能有效实现状态管理,开发者可根据项目需求选择适合的方式。

Vuex是Vue.js的状态管理库,提供集中式存储和可预测的状态变更。


Pinia已成为Vue官方推荐的新状态管理库,兼容Vue2.x,API与Vuex5类似。


Vuex3/4将继续维护但不添加新功能。


两者可共存,但新项目建议使用Pinia。


Vuex的核心流程包括:组件通过dispatch触发actions异步操作,actions通过commit调用mutations同步修改state,最终state变化触发视图更新。


Vuex 4 中视图(组件)与 Store 交互 - Options API

交互场景对应 API使用方式适用场景特点
获取状态mapState1. 数组形式:mapState(['count', 'user'])
2. 对象形式:mapState({ localCount: 'count' })
3. 函数形式:mapState({ sum: state => state.a + state.b })
组件需要访问 store 中的状态- 将 store 状态映射为组件的计算属性
- 自动响应状态变化
- Options API 专用辅助函数
获取派生状态mapGetters1. 数组形式:mapGetters(['doneTodos'])
2. 对象形式:mapGetters({ doneCount: 'doneTodosCount' })
组件需要访问计算后的状态- 映射为组件的计算属性
- 复用复杂状态逻辑
- Options API 专用辅助函数
提交变更mapMutations1. 数组形式:mapMutations(['increment'])
2. 对象形式:mapMutations({ add: 'increment' })
组件需要提交 mutation 同步修改状态- 映射为组件方法
- 只能同步操作
- Options API 专用辅助函数
分发动作mapActions1. 数组形式:mapActions(['fetchUser'])
2. 对象形式:mapActions({ getUser: 'fetchUser' })
组件需要触发异步操作或复杂业务逻辑- 映射为组件方法
- 可包含异步操作
- Options API 专用辅助函数
模块交互命名空间辅助函数createNamespacedHelpers('moduleName')
const { mapState } = createNamespacedHelpers('user')
访问特定命名空间模块的状态/方法- 简化命名空间模块的访问
- 避免名称冲突
- Options API 专用
直接访问this.$storethis.$store.state.count
this.$store.commit('increment')
this.$store.dispatch('fetchUser')
在组件方法中直接操作 store- 不需要辅助函数映射
- 适合在组件方法内部使用
模块交互命名空间路径this.$store.state.moduleA.data
this.$store.getters['moduleA/getterName']
this.$store.commit('moduleA/mutationName')
直接访问模块内的内容- 需要知道完整路径
- 适合简单访问
- Options API 中通过this.$store访问

Vuex 4 中视图(组件)与 Store 交互 - Composition API

交互场景对应 API使用方式适用场景特点
获取 store 实例useStoreimport { useStore } from 'vuex'
const store = useStore()
获取 Vuex store 实例- Composition API 的入口点
- 必须在setup()函数内调用
获取状态store.state+computedconst count = computed(() => store.state.count)
const user = computed(() => store.state.user)
访问 store 中的状态- 结合 Vue 3 的computed函数
- 自动响应式更新
获取派生状态store.getters+computedconst doneTodos = computed(() => store.getters.doneTodos)
const filteredList = computed(() => store.getters['module/filtered'])
访问计算后的状态- 直接访问 getters 对象
- 支持命名空间路径
提交变更store.commit1. 字符串风格:store.commit('increment', payload)
2. 对象风格:store.commit({ type: 'increment', ...payload })
3. 命名空间:store.commit('module/increment', payload)
提交 mutation 同步修改状态- 直接调用 store 实例方法
- 支持所有 mutation 调用方式
分发动作store.dispatch1. 字符串风格:store.dispatch('fetchUser', payload)
2. 对象风格:store.dispatch({ type: 'fetchUser', ...payload })
3. 命名空间:store.dispatch('module/fetchUser', payload)
触发异步操作或复杂业务逻辑- 直接调用 store 实例方法
- 支持所有 action 调用方式
响应状态变化watch+store.statewatch(() => store.state.user, (newVal) => {...})
watch(() => store.state.module.data, handler)
监听 store 中特定状态的变化- 精细控制监听逻辑
- 可执行副作用操作
- Composition API 风格
响应状态变化watchEffectwatchEffect(() => { console.log(store.state.count) })自动追踪依赖的状态变化- 自动收集依赖
- 立即执行一次
模块交互直接路径访问store.state.moduleA.data
store.getters['moduleA/getterName']
store.commit('moduleA/mutationName')
store.dispatch('moduleA/actionName')
直接访问模块内的内容- 需要知道完整路径
- 统一通过 store 实例访问
创建响应式引用toRefs+store.stateimport { toRefs } from 'vue'
const { count, user } = toRefs(store.state)
将状态解构为响应式引用- 保持响应式的同时解构状态
- 避免.value访问

代码示例对比

Options API 示例

import { mapState, mapGetters, mapActions, mapMutations } from 'vuex' export default { computed: { // 映射状态 ...mapState(['count', 'user']), ...mapState({ localCount: 'count' }), // 映射 getters ...mapGetters(['doubleCount']) }, methods: { // 映射 mutations ...mapMutations(['increment']), // 映射 actions ...mapActions(['fetchUser']), // 直接通过 $store 访问 customMethod() { this.$store.commit('increment') this.$store.dispatch('fetchUser') } } }

Composition API 示例

import { useStore } from 'vuex' import { computed, watch } from 'vue' export default { setup() { const store = useStore() // 状态访问 const count = computed(() => store.state.count) const user = computed(() => store.state.user) // getters 访问 const doubleCount = computed(() => store.getters.doubleCount) // 方法封装 const increment = () => store.commit('increment') const fetchUser = () => store.dispatch('fetchUser') // 监听状态变化 watch( () => store.state.count, (newCount) => { console.log('Count changed:', newCount) } ) // 模块访问示例 const moduleData = computed(() => store.state.moduleA.data) const updateModuleData = () => store.commit('moduleA/update', payload) return { count, user, doubleCount, increment, fetchUser, moduleData, updateModuleData } } }

关键差异总结

  1. 访问方式

    • Options API: 主要通过辅助函数 (mapXxx) 或this.$store

    • Composition API: 统一通过useStore()返回的 store 实例

  2. 响应式处理

    • Options API: 辅助函数自动处理响应式

    • Composition API: 需要手动使用computed()包装状态

  3. 模块访问

    • Options API: 可以使用createNamespacedHelpers或完整路径

    • Composition API: 统一使用完整路径访问

  4. 代码组织

    • Options API: 按选项 (computed, methods) 组织

    • Composition API: 按功能逻辑组织,相关代码集中在一起


重要注意事项

  • Mutation: 必须是同步函数,用于状态变更

  • Action: 可以包含异步操作,通过提交 mutation 来改变状态

  • Getter: 类似于计算属性,会对结果进行缓存

  • 响应式: Vuex 4 与 Vue 3 响应式系统完全集成,状态变化会自动更新组件


Vuex 4 专门为 Vue 3 设计,提供了完整的 TypeScript 支持,在 Composition API 中尤其强大。


Vuex 4 Store 内部数据流转和 API 总结


1. 核心概念数据流转

数据流转方向触发方式使用 API执行内容是否可异步开发者控制典型场景
组件 → Action用户交互、组件生命周期dispatch()处理业务逻辑、异步操作、组合多个 mutations直接调用API 请求、复杂业务逻辑、条件判断
Action → MutationAction 内部逻辑commit()提交状态变更请求,传递载荷(payload)间接调用准备数据、验证后提交变更
Mutation → StateMutation 执行直接赋值实际修改状态数据间接控制状态更新、数组操作、对象修改
State → Getter状态读取时自动计算getter 函数基于状态派生新数据,类似计算属性定义函数过滤列表、计算统计值、格式化数据
Getter → 组件组件访问状态时getters访问提供派生状态给组件使用读取结果显示处理后的数据、复用复杂逻辑

2. Store 内部 API 详解

API 类别方法名参数格式返回值作用使用限制
状态管理state-响应式对象存储应用状态只能通过 mutation 修改
变更提交commit(type, payload)1.(mutationName, payload)
2.({ type: mutationName, ...payload })
void提交 mutation 同步修改状态必须对应已注册的 mutation
动作分发dispatch(type, payload)1.(actionName, payload)
2.({ type: actionName, ...payload })
Promise分发 action 处理异步或复杂逻辑返回 Promise,可链式调用
计算属性getters-各种类型提供基于 state 的计算值必须有返回值
模块注册registerModule(path, module)1.(path, module)
2.(path, module, options)
void动态注册模块已存在的模块不能被重复注册
模块卸载unregisterModule(path)(path)void动态卸载模块不能卸载静态模块
状态替换replaceState(state)(state)void替换整个 store 的状态谨慎使用,可能破坏响应式
插件监听subscribe(callback)(callback)取消订阅函数监听 mutation 提交callback 接收 mutation 和 state
动作监听subscribeAction(callback)(callback)取消订阅函数监听 action 分发callback 接收 action 和 state
热重载hotUpdate(newOptions)(newOptions)void开发时热更新模块仅用于开发环境

3. Mutation 与 Action 对比

特性MutationAction
目的修改状态组合业务逻辑
调用方式commit()dispatch()
异步性必须同步可以异步
返回值可返回 Promise
可追踪性被 Devtools 记录可被 subscribeAction 监听
执行顺序同步立即执行可包含异步操作
典型用途直接状态变更API 调用、条件逻辑、多个 mutation 组合
调试有状态快照有 before/after 钩子

4. 模块内部 API 结构

API 类型模块中定义位置访问方式命名空间影响示例
state模块选项store.state.moduleName状态自动命名空间化state: { count: 0 }
gettersgetters对象store.getters['moduleName/getterName']自动添加命名空间前缀doubleCount(state) { return state.count * 2 }
mutationsmutations对象store.commit('moduleName/mutationName')自动添加命名空间前缀increment(state) { state.count++ }
actionsactions对象store.dispatch('moduleName/actionName')自动添加命名空间前缀async fetchData({ commit }) { ... }
嵌套模块modules对象多级路径访问路径继承父级命名空间modules: { subModule: { ... } }
本地上下文Action 参数{ state, commit, dispatch, getters, rootState, rootGetters }自动提供本地和根上下文actionName(context) { ... }

5. 数据流转示例流程

组件触发 ↓ dispatch('fetchUser', userId) // 组件调用 ↓ Action: fetchUser(context, payload) │ → 发起 API 请求 (异步) │ → 处理响应数据 ↓ commit('SET_USER', userData) // Action 内部调用 ↓ Mutation: SET_USER(state, payload) │ → 直接修改 state.user ↓ State 更新 (user 数据变化) ↓ Getter: currentUser(state) 自动重新计算 │ → 基于新 state.user 派生数据 ↓ 组件自动重新渲染 │ → computed 属性获取新值 ↓ 视图更新完成

6. 插件和辅助 API

API用途使用时机示例
createStore(options)创建 store 实例应用初始化const store = createStore({ state, mutations, actions })
createLogger(options)创建日志插件开发环境调试plugins: [createLogger()]
store.subscribe()监听 mutations日志、持久化store.subscribe((mutation, state) => { console.log(mutation.type) })
store.subscribeAction()监听 actions性能监控、错误追踪store.subscribeAction({ before: (action) => {...}, after: (action) => {...} })
store.watch()响应式监听状态特定状态变化处理store.watch(state => state.user, user => { ... })

7. 类型安全的 TypeScript 支持

APITypeScript 类型用途示例
State类型interface StoreState定义状态结构interface State { user: User; count: number }
Getter类型函数类型定义 getter 类型getters: { doubleCount: (state: State) => number }
Mutation类型函数类型定义 mutation 类型mutations: { [MutationTypes.SET_USER]: (state: State, user: User) => void }
Action类型函数类型定义 action 类型actions: { [ActionTypes.FETCH_USER]: (context: ActionContext, id: string) => Promise<void> }
Store泛型Store<State>类型化 store 实例const store: Store<State> = createStore({ ... })
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 4:19:58

2026年TOP5口碑背胶供应厂家排行榜揭晓

大家好&#xff0c;我是你们的老朋友小安。今天咱们聊聊一个非常实用的话题——背胶供应厂家。在装修和建筑领域&#xff0c;背胶的质量直接关系到墙面的美观和耐用性。那么&#xff0c;在众多品牌中&#xff0c;哪些厂家的产品最值得信赖呢&#xff1f;今天我们就来揭晓2026年…

作者头像 李华
网站建设 2026/5/2 22:01:20

jquery实现大文件分块上传的解决方案有哪些总结?

【一个.NET程序员的悲喜交加&#xff1a;前端搞定了&#xff0c;后端求包养&#xff01;】 各位道友好&#xff01;俺是山西某个人.NET程序员&#xff0c;刚啃完《C#从入门到住院》&#xff0c;就被客户按头要求搞个20G大文件上传下载系统。现在前端用Vue3原生JS硬怼出了半成品…

作者头像 李华
网站建设 2026/5/3 13:52:10

vue2框架下如何优化大文件上传的方案总结?

《一个前端打工人的奇幻外包历险记》 需求分析&#xff1a;这需求是灭霸提的吧&#xff1f; 各位同行大家好&#xff01;我是一名在福建"苟延残喘"的个人前端开发者。最近接了个外包项目&#xff0c;看到需求文档时我的表情是这样的&#xff1a;&#x1f628; → &…

作者头像 李华
网站建设 2026/5/1 16:22:06

jspm基于JSP高校研招考研招生信息共享系统的设计与实现

文章目录研究背景系统目标技术方案核心功能创新点应用价值--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;以下是关于“基于JSP的高校研招考研招生信息共享系统设计与实现”的摘要内容整理&#xff0c;结合常见学术…

作者头像 李华
网站建设 2026/5/1 17:44:31

nodejs+vue景区自行车租赁管理系统 og8s633w

文章目录 系统概述核心功能技术栈系统优势适用场景 --nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统概述 Node.js与Vue.js结合的景区自行车租赁管理系统&#xff08;项目标识&#xff1a;og8s633w&#xff09…

作者头像 李华
网站建设 2026/5/1 17:25:31

vue基于nodejs+vue的漫画动漫订阅系统天堂网31g9n442

文章目录Vue 与 Node.js 的漫画动漫订阅系统概述技术栈与核心功能开发与部署要点注意事项--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;Vue 与 Node.js 的漫画动漫订阅系统概述 基于 Vue 和 Node.js 的漫画动漫订…

作者头像 李华