Vuex之理解Mutations的用法实例

发布时间 - 2026-01-11 00:44:03    点击率:

1.什么是mutations?

上一篇文章说的getters是为了初步获取和简单处理state里面的数据(这里的简单处理不能改变state里面的数据),Vue的视图是由数据驱动的,也就是说state里面的数据是动态变化的,那么怎么改变呢,切记在Vuexstore数据改变的唯一方法就是mutation

通俗的理解mutations,里面装着一些改变数据方法的集合,这是Veux设计很重要的一点,就是把处理数据逻辑方法全部放在mutations里面,使得数据和视图分离。

2.怎么用mutations?

mutation结构:每一个mutation都有一个字符串类型的事件类型(type)和回调函数(handler),也可以理解为{type:handler()},这和订阅发布有点类似。先注册事件,当触发响应类型的时候调用handker(),调用type的时候需要用到store.commit方法。

const store = new Vuex.Store({
  state: {
    count: 1
    },
  mutations: {
  increment (state) {   //注册时间,type:increment,handler第一个参数是state;
     // 变更状态
    state.count++}}})
    
  store.commit('increment')  //调用type,触发handler(state)   

载荷(payload):简单的理解就是往handler(stage)中传参handler(stage,pryload);一般是个对象。

 mutations: {
 increment (state, n) {
   state.count += n}}
 store.commit('increment', 10)
mutation-types:将常量放在单独的文件中,方便协作开发。
  // mutation-types.js
 export const SOME_MUTATION = 'SOME_MUTATION'
  // store.js
import Vuex from 'vuex'
import { SOME_MUTATION } from './mutation-types'

 const store = new Vuex.Store({
  state: { ... },
  mutations: {
   // 我们可以使用 ES2015 风格的计算属性命名功能来使用一个常量作为函数名
  [SOME_MUTATION] (state) {
  // mutate state
 }
}
})

commit:提交可以在组件中使用 this.$store.commit('xxx') 提交 mutation,或者使用 mapMutations 辅助函数将组件中的 methods 映射为 store.commit 调用(需要在根节点注入 store)。

import { mapMutations } from 'vuex'

export default {

methods: {
 ...mapMutations([
  'increment' // 映射 this.increment() 为 
this.$store.commit('increment')]),
 ...mapMutations({
  add: 'increment' // 映射 this.add() 为 
this.$store.commit('increment')
 })}}

3.源码分析

registerMutation:初始化mutation

function registerMutation (store, type, handler, path = []) {
 //4个参数,store是Store实例,type为mutation的type,handler,path为当前模块路径
  const entry = store._mutations[type] || (store._mutations[type] = 
[]) //通过type拿到对应的mutation对象数组
   entry.push(function wrappedMutationHandler (payload) {
   //将mutation包装成函数push到数组中,同时添加载荷payload参数  
   handler(getNestedState(store.state, path), payload)
   //通过getNestedState()得到当前的state,同时添加载荷payload参数
  })
 }

commit:调用mutation

commit (type, payload, options) {
 // 3个参数,type是mutation类型,payload载荷,options配置
  if (isObject(type) && type.type) {
    // 当type为object类型,
   options = payload
   payload = type
   type = type.type
 }
 const mutation = { type, payload }
 const entry = this._mutations[type]
  // 通过type查找对应的mutation
 if (!entry) {
 //找不到报错
  console.error(`[vuex] unknown mutation type: ${type}`)
  return
 }
 this._withCommit(() => {
  entry.forEach(function commitIterator (handler) {
  // 遍历type对应的mutation对象数组,执行handle(payload)方法
  //也就是开始执行wrappedMutationHandler(handler)
   handler(payload)
  })
 })
 if (!options || !options.silent) {
  this._subscribers.forEach(sub => sub(mutation, this.state))
  //把mutation和根state作为参数传入
 }
}

subscribers:订阅storemutation

subscribe (fn) {
const subs = this._subscribers
if (subs.indexOf(fn) < 0) {
 subs.push(fn)
 }
return () => {
 const i = subs.indexOf(fn)
 if (i > -1) {
  subs.splice(i, 1)
  }
 }
 }

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# vuex  # mutations  # vue  # vue.js  # vuex中store的action和mutations用法  # vuex mutations的两种调用方法小结  # Vuex中的Mutations的具体使用方法  # Vuex modules模式下mapState/mapMutations的操作实例  # 在Vuex使用dispatch和commit来调用mutations的区别详解  # vuex中的 mapState  # mapGetters  # mapActions  # mapMutations 的使用  # 详解vuex中mapState  # mapMutations  # mapActions的作用  # Vuex中mutations与actions的区别详解  # vuex mutations 同步操作方法详解  # 放在  # 这是  # 是个  # 注册时间  # 都有  # 第一个  # 是由  # 找不到  # 遍历  # 上一  # 很重要  # 可以使用  # 报错  # 这和  # 回调  # 装着  # 大家多多  # 组中  # 是为了  # 也就是说 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 北京企业网站设计制作公司,北京铁路集团官方网站?  敲碗10年!Mac系列传将迎来「触控与联网」双革新  长沙企业网站制作哪家好,长沙水业集团官方网站?  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  Laravel如何实现API资源集合?(Resource Collection教程)  Laravel如何实现事件和监听器?(Event & Listener实战)  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  如何在Windows 2008云服务器安全搭建网站?  Python3.6正式版新特性预览  制作电商网页,电商供应链怎么做?  Linux系统命令中tree命令详解  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  android nfc常用标签读取总结  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  Laravel如何处理表单验证?(Requests代码示例)  微信推文制作网站有哪些,怎么做微信推文,急?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  Android利用动画实现背景逐渐变暗  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  Laravel如何处理和验证JSON类型的数据库字段  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  如何彻底卸载建站之星软件?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Mybatis 中的insertOrUpdate操作  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  ,怎么在广州志愿者网站注册?  简单实现Android文件上传  深圳网站制作培训,深圳哪些招聘网站比较好?  bootstrap日历插件datetimepicker使用方法  使用Dockerfile构建java web环境  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  Java遍历集合的三种方式  网站制作价目表怎么做,珍爱网婚介费用多少?  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  米侠浏览器网页背景异常怎么办 米侠显示修复  如何在IIS服务器上快速部署高效网站?  详解Oracle修改字段类型方法总结  C++时间戳转换成日期时间的步骤和示例代码  PythonWeb开发入门教程_Flask快速构建Web应用  高防服务器:AI智能防御DDoS攻击与数据安全保障  微信小程序 scroll-view组件实现列表页实例代码  Laravel如何使用Blade模板引擎?(完整语法和示例)  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】