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 nextSibling 与 getNextElement(node) 使用介绍
Oct 13 Javascript
jQuery提示效果代码分享
Nov 20 Javascript
利用jquery获取select下拉框的值
Nov 23 Javascript
js 数字、字符串、布尔值的转换方法(必看)
Apr 07 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
Oct 27 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
Sep 07 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
Dec 29 jQuery
详解vue几种主动刷新的方法总结
Feb 19 Javascript
通过javascript实现段落的收缩与展开
Jun 26 Javascript
JavaScript Blob对象原理及用法详解
Oct 14 Javascript
vuex的使用和简易实现
Jan 07 Vue.js
js面向对象方式实现拖拽效果
Mar 03 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
漫荒推荐:画风超赞的国风漫画推荐 超长假期不无聊
2020/03/08 国漫
php中用文本文件做数据库的实现方法
2008/03/27 PHP
php 应用程序安全防范技术研究
2009/09/25 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
php简单复制文件的方法
2016/05/09 PHP
php实现统计二进制中1的个数算法示例
2018/01/23 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
createElement动态创建HTML对象脚本代码
2008/11/24 Javascript
根据出生日期自动取得星座的js代码
2010/07/20 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
js跨浏览器的事件侦听器和事件对象的使用方法
2015/12/17 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
React-router v4 路由配置方法小结
2017/08/08 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
2017/09/16 Javascript
js捆绑TypeScript声明文件的方法教程
2018/04/13 Javascript
基于JS实现html中placeholder属性提示文字效果示例
2018/04/19 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
2019/04/14 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
layer更改皮肤的实现方法
2019/09/11 Javascript
Python中正则表达式的用法实例汇总
2014/08/18 Python
Python中文字符串截取问题
2015/06/15 Python
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
2016/05/28 Python
numpy判断数值类型、过滤出数值型数据的方法
2018/06/09 Python
Python如何获取文件路径/目录
2020/09/22 Python
canvas与html5实现视频截图功能示例
2016/12/15 HTML / CSS
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
教育科学研究生自荐信
2013/10/09 职场文书
合作意向书格式及范文
2014/03/31 职场文书
超市开店计划书
2014/09/15 职场文书
财务审计整改报告
2014/11/06 职场文书
运动会主持词大全
2015/07/02 职场文书
庆七一活动简报
2015/07/20 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python