Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解


Posted in Javascript onJanuary 18, 2019

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。

Vuex 中的 mutation 非常类似于事件:

每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数。mutation 必须是同步函数。

不带载荷(只改变数据的状态)

接前面几篇文章的例子,这里我们修改商品价格减半。

store.js

mutations: {
    //商品价格减半;更改这个数据状态必须将这个数据源state传递过来
    goodsPriceHalve: state => {
      let goodsPriceHalve = state.goodsList.map(currentValue => {
        return {
          name: currentValue.name,
          price: currentValue.price/2
        }
      })
      state.goodsList = goodsPriceHalve;
    }
  }

page5.vue

要唤醒一个 mutation handler,你需要以相应的 type(事件) 调用 store.commit 方法。

<template>
  <div>
    <h2>我是第三个页面</h2>
    <!-- 直接在HTML标签中使用 -->
    <div>{{$store.state.goodsList}}</div>
    <br>
    <router-link to='/page6'>更改商品名字</router-link>
    <br>
    <button @click="handleGoodsHavle">商品价格减半</button>
    <ul class="ul_list">
      <li v-for="item in goodsListHalv">
        <p class="name">商品:{{item.name}}</p>
        <p class="price">价格:¥{{item.price}}</p>
      </li>
    </ul>
  </div>
</template>
<script>
 export default {
   data() {
    return {
      /*
      // mutations不能通过直接赋值的形式改变state的数据状态
      goodsListHalv: this.$store.state.goodsList,
      */
      // goodsListHalv: []
    }
   },
   /*
  //  mutations不能通过钩子函数的形式进行赋值
   mounted(){
     this.goodsListHalv = this.$store.state.goodsList
  },
  */
  // 通过计算属性的方式,是完美的
   computed: {
     goodsListHalv(){
       return this.$store.state.goodsList;
     }
   },
   methods: {
     handleGoodsHavle: function(){
       //这里只通过事件改变数据的状态
        this.$store.commit('goodsPriceHalve')
     }
   }
  }
</script>

效果图

Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解

提交载荷(Payload)(改变数据状态的同时传递参数)

参数:字符串/对象

这里修改商品名字。

store.js

// 通过组件上的事件,通过this.$store.commit('mutations中的函数','需要从组件上传递给 mutation中这个函数的参数')
  mutations: {
    // 统一修改商品的名称;changeName(state,payload)参数1 state:数据源,参数2 payload:接收的参数
    changeName: (state,payload) => {
      var changeName = state.goodsList.map(currentValue => {
        return {
          name: payload,//接收参数
          price: currentValue.price/2
        }
      })
      state.goodsList = changeName;
    }
  }

这里的载荷payload可以是一个对象/字符串。

page6.vue

<template>
  <div>
    <h2>我是第四个页面</h2>
    <div>
      <input type="text" placeholder="请输入商品的新名字" v-model="inpValue">
      <button @click="changeGoodsName()">商品价格减半</button>
    </div>
    <router-link to='/page7'>action</router-link>
    <ul class="ul_list">
      <li v-for="item in goodsListHalv">
        <p class="name">商品:{{item.name}}</p>
        <p class="price">价格:¥{{item.price}}</p>
      </li>
    </ul>
  </div>
</template>
<script>
 export default {
   data() {
    return {
      inpValue:'',
    }
   },
   computed: {
     goodsListHalv(){
       return this.$store.state.goodsList;
     }
   },
   methods: {
    //  通过 click事件触发methods中的函数,进而改变store.js中数据的状态
     changeGoodsName: function(){
        // this.$store.commit('需要操作mutations中的函数名','从这个组件传递给第一个参数的参数')
        this.$store.commit('changeName',this.inpValue)
     }
   }
  }
</script>

这里的载荷payload就是输入框的值。

效果图

Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解

代码执行过程

上面的Mutation执行过程是:按钮点击?>执行组件中按钮点击事件方法?>执行$store.commit('vuex中mutatioms对象中对应的函数名',需要传递的参数)?>执行mutations里面对应的方法?>修改state里面对应的数据?>页面渲染。

Mutation 需遵守 Vue 的响应规则

既然 Vuex 的 store 中的状态是响应式的,那么当我们变更状态时,监视状态的 Vue 组件也会自动更新。这也意味着 Vuex 中的 mutation 也需要与使用 Vue 一样遵守一些注意事项:

最好提前在你的 store 中初始化好所有所需属性。当需要在对象上添加新属性时,你应该使用 Vue.set(obj, 'newProp', 123), 或者以新对象替换老对象。例如,利用 stage-3 的对象展开运算符我们可以这样写:

state.obj = { ...state.obj, newProp: 123 }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Javascript 相关文章推荐
javascript 定义初始化数组函数
Sep 07 Javascript
对 lightbox JS 图片控件进行了一下改造, 使其他支持复杂的图片说明
Mar 20 Javascript
自写的一个jQuery圆角插件
Oct 26 Javascript
jQuery复制表单元素附源码分享效果演示
Sep 30 Javascript
JavaScript中 DOM操作方法小结
Apr 25 Javascript
微信小程序实现下载进度条的方法
Dec 08 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
Jan 07 Javascript
vue侧边栏动态生成下级菜单的方法
Sep 07 Javascript
js获取form表单中name属性的值
Feb 27 Javascript
ES6知识点整理之Proxy的应用实例详解
Apr 16 Javascript
微信小程序实现发送模板消息功能示例【通过openid推送消息给用户】
May 05 Javascript
解决vue 给window添加和移除resize事件遇到的坑
Jul 21 Javascript
JavaScript数据结构之栈实例用法
Jan 18 #Javascript
Vue核心概念Action的总结
Jan 18 #Javascript
js取小数点后两位四种方法
Jan 18 #Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
Jan 18 #jQuery
jquery获取file表单选择文件的路径、名字、大小、类型
Jan 18 #jQuery
jQuery实现适用于移动端的跑马灯抽奖特效示例
Jan 18 #jQuery
js数组去重的方法总结
Jan 18 #Javascript
You might like
PHP IN_ARRAY 函数使用注意事项
2010/07/24 PHP
php+ajax实现无刷新分页的方法
2014/11/04 PHP
详解PHP用substr函数截取字符串中的某部分
2016/12/03 PHP
创建无限极分类树型结构的简单方法
2017/06/20 PHP
PHP levenshtein()函数用法讲解
2019/03/08 PHP
用js实现控制内容的向上向下滚动效果
2007/06/26 Javascript
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
JS重要知识点小结
2011/11/06 Javascript
javascript中比较字符串是否相等的方法
2013/07/23 Javascript
javascript从右边截取指定字符串的三种实现方法
2013/11/29 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
2013/12/17 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
javascript实现tab切换的两个实例
2015/11/05 Javascript
Bootstrap树形组件jqTree的简单封装
2016/01/25 Javascript
JavaScript随机生成颜色的方法
2016/10/15 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
vue 权限认证token的实现方法
2018/07/17 Javascript
python基础教程之字典操作详解
2014/03/25 Python
Python写的一个简单监控系统
2015/06/19 Python
python2 与python3的print区别小结
2018/01/16 Python
Windows下安装Django框架的方法简明教程
2018/03/28 Python
python实现汽车管理系统
2018/11/30 Python
Django实现微信小程序的登录验证功能并维护登录态
2019/07/04 Python
python生成大写32位uuid代码
2020/03/03 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
Farfetch香港官网:汇集全球时尚奢侈品购物平台
2017/11/26 全球购物
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
2014年师德承诺书
2014/05/23 职场文书
医院合作协议书
2014/08/19 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
2015出纳试用期工作总结
2014/12/12 职场文书
公司转让协议书
2016/03/19 职场文书
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers