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 相关文章推荐
firefox和IE系列的相关区别整理 以备后用
Dec 28 Javascript
js location.replace与location.reload的区别
Sep 08 Javascript
Json字符串转换为JS对象的高效方法实例
May 01 Javascript
js弹出层包含flash 不能关闭隐藏的2种处理方法
Jun 17 Javascript
使用RequireJS优化JavaScript引用代码的方法
Jul 01 Javascript
jQuery+HTML5美女瀑布流布局实现方法
Sep 21 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
Mar 09 Javascript
AngularJS实现表格的增删改查(仅限前端)
Jul 04 Javascript
JS实现页面打印(整体、局部)
Aug 18 Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
Jan 10 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
Sep 21 Javascript
JavaScript 实现继承的几种方式
Feb 19 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
世界收音机发展史
2021/03/01 无线电
php 无限分类的树类代码
2009/12/03 PHP
Discuz!下Memcache缓存实现方法
2010/05/28 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
PHP大文件分块上传功能实例详解
2019/07/22 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
javascript URL编码和解码使用说明
2010/04/12 Javascript
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
jquery点击展示与隐藏更多内容
2016/12/03 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
vue-router路由简单案例介绍
2017/02/21 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
checkbox:click事件触发span元素内容改变的方法
2017/09/11 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
Python编程中对文件和存储器的读写示例
2016/01/25 Python
python爬取NUS-WIDE数据库图片
2016/10/05 Python
Python实现的排列组合计算操作示例
2017/10/13 Python
tensorflow 获取模型所有参数总和数量的方法
2018/06/14 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
解决python3 Pycharm上连接数据库时报错的问题
2018/12/03 Python
基于python调用jenkins-cli实现快速发布
2020/08/14 Python
耐克中国官方商城:Nike中国
2018/10/18 全球购物
教师实习自我鉴定
2013/12/11 职场文书
自查自纠工作总结
2014/10/15 职场文书
学校领导班子成员查摆问题及整改措施
2014/10/28 职场文书
2014年实习班主任工作总结
2014/11/08 职场文书
会计专业自荐信范文
2019/05/22 职场文书
MySQL中的隐藏列的具体查看
2021/09/04 MySQL