Vue面试题39:vuex中mutations和actions有何区别?(总结自B站up主‘前端杨村长’视频,仅供自用学习)
-
体验:
-
看下面的的例子:"action"类似于"mutation",不同在于:
action
提交的是mutation
,而不具备直接修改状态的能力;action
可以包含任意异步操作;
-
import { createStore } from 'vuex' export default createStore({ state: { count: 0 }, mutations: { INCREMENT (state) { state.count++ } }, actions: { increment ({ commit }) { commit('INCREMENT') } } })
-
答题思路
- 1.给出两者概念说明区别
- 2.举例说明应用场景
- 3.使用细节不同
- 4.简单阐述实现上差异
-
回答范例
- 1.官方文档说:更改Vuex的store中的状态的唯一方法是提交
mutation
,mutation
非常类似于事件:每个mutation
都有一个字符串的类型(type)和一个回调函数(handler)。action
类似于mutation,不同在于:action
可以包含任意异步操作,但它不能直接修改状态,也需要提交mutation
才行; - 2.因此,开发时,包含异步操作或者复杂业务组合时应使用
action
;需要直接修改状态则提交mutation
;但由于dispatch
和commit
是两个API,容易引起混淆,实践中也会采用统一使用dispatch action
的方式; - 3.调用
dispatch
和commit
两个API时几乎完全一样,但是定义两者时却不甚相同,mutation
的回调函数接收的参数是state对象;action则是与Store实例具有相同方法和属性的上下文context对象,因此一般会解构它为{commit,dispatch,state}
,从而方便编码。另外dispatch会返回Promise实例便于处理内部异步结果; - 4.实现上
commit(type)
方法相当于调用options.mutations[type](state)
;dispatch(type)
方法相当于调用options.actions[type](store)
,这样就很容易理解两者使用上的不同了;
- 1.官方文档说:更改Vuex的store中的状态的唯一方法是提交
-
简单的源码实现
-
class Store { constructor(options) { this.state = options.state this.options = options } commit(type, payload) { // commit传入的上下文和参数1都是state对象 this.options.mutations[type].call(this.state, this.state, payload) } dispatch(type, payload) { this.options.actions[type].call(this, this, payload) } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!