浅谈vuex actions和mutation的异曲同工


Posted in Javascript onDecember 13, 2018

vuex说明:

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

包含的内容:

  • state:驱动应用的数据源;
  • view:以生命方式将state映射到视图;
  • actions:响应在view上的用户输入导致的状态变化;

流程示意图

浅谈vuex actions和mutation的异曲同工

但是,当我们的应用遇到多个组件共享状态时,单向数据流的简洁性很容易被破坏:

多个视图依赖于同一状态。

来自不同视图的行为需要变更同一状态。

对于问题一,传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。

对于问题二,我们经常会采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝。以上的这些模式非常脆弱,通常会导致无法维护的代码。

因此,我们为什么不把组件的共享状态抽取出来,以一个全局单例模式管理呢?在这种模式下,我们的组件树构成了一个巨大的“视图”,不管在树的哪个位置,任何组件都能获取状态或者触发行为!

另外,通过定义和隔离状态管理中的各种概念并强制遵守一定的规则,我们的代码将会变得更结构化且易维护。

浅谈vuex actions和mutation的异曲同工

适用于型单页应用

安装vuex

npm i vuex

新建文件夹store,建议目录

浅谈vuex actions和mutation的异曲同工

Actions 和 mutation

mutation:(必须是同步函数)

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

mutations: {
  addNum(state) { 
   state.num ++
  }
}

你可以向 store.commit 传入额外的参数,即 mutation 的 载荷(payload):在大多数情况下,载荷应该是一个对象,这样可以包含多个字段并且记录的 mutation 会更易读:

mutations: {
  addNum(state,Payload) { 
   state.num +=Payload.amount
  }
}

不能直接调用一个 mutation handler。这个选项更像是事件注册:“当触发一个类型为 increment 的 mutation 时,调用此函数。”要唤醒一个 mutation handler,你需要以相应的 type 调用 store.commit 方法:

//页面中的操作(一、不带参数)
 methods:{
  add(){
   this.$store.commit('addNum')
  }
 }
//二、带参数的情况下
data(){
argument:{
 amount:10
},
methods:{
  add(){
   this.$store.commit('addNum',this.arguments)
  }
 }

actions

Action 类似于 mutation,不同在于:

  • Action 提交的是 mutation,而不是直接变更状态。
  • Action 可以包含任意异步操作。
mutations: {
  addNum(state,amount) {
   state.num +=amount
  },
  someMutation(state) {
   setTimeout(()=>{
     state.count--
   },1000)
  }
 },
 actions: {
  increment (context,args) {
      context.commit('addNum',args)
  }
 },
//另一种写法
 actions: {
  increment ({commit},args) {
      commit('addNum',args)
  }
 }

Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters

分发Action

//页面中
methods:{
  add(){
   this.$store.dispatch('increment',this.pa.amount)
  }
 },

区别:

action和mutation都可以改变state中数据的状态,但是action可以处理异步函数可以在devtool中追踪数据变化,而mutation只可以处理同步函数,当处理异步函数的时候检测不到数据变化;

mutation 处理同步异步

mutations: {
//同步
  addNum(state,amount) {
   state.num +=amount
  },
//异步
  someMutation(state) {
   setTimeout(()=>{
     state.count--
   },1000)
  }
 }

页面中操作

<template>
<div>
   <p @click="add">同步{{num}}</p>
  <p @click="reduce">异步{{count}}</p>
</div>
</template>
 methods:{
  //同步
  add(){
   this.$store.commit('increment',this.pa.amount)
  },
//异步
  reduce(){
   this.$store.commit('someMutation')
  }
 }

数据变化之前,浏览器中显示,devtool中的数据状态

浅谈vuex actions和mutation的异曲同工

浅谈vuex actions和mutation的异曲同工

当页面中的数据改变之后,追踪数据

浅谈vuex actions和mutation的异曲同工

浅谈vuex actions和mutation的异曲同工

action 处理同步异步

mutations: {
  addNum(state, amount) {
   state.num += amount
  },
  someMutation(state) {
    state.count-- 
  }
 },
 actions: {
  increment({commit}, args) {
   commit('addNum', args)
  },
  actionSomemution(context) {
   setTimeout(() => {
     context.commit('someMutation') 
   }, 1000)
  }
 }

页面中

methods:{
  add(){
   this.$store.dispatch('increment',this.pa.amount)
  },
  reduce(){
   this.$store.dispatch('actionSomemution')
  }
 },

数据变化之前,浏览器中显示,与devtool中数据显示

浅谈vuex actions和mutation的异曲同工

浅谈vuex actions和mutation的异曲同工

操作之后数据变化,

浅谈vuex actions和mutation的异曲同工

浅谈vuex actions和mutation的异曲同工
----

小结:mutation只能处理同步函数,在devtools检测不到状态树中数据的变化,而actions可以处理同异步数据,可以在devtools检测数据变化,这样就好理解了

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

Javascript 相关文章推荐
js运动框架_包括图片的淡入淡出效果
May 11 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
Feb 26 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
Dec 31 Javascript
js基于cookie方式记住返回页面用法示例
May 27 Javascript
Angular 4.X开发实践中的踩坑小结
Jul 04 Javascript
vue2.0 常用的 UI 库实例讲解
Dec 12 Javascript
vue项目中引入noVNC远程桌面的方法
Mar 05 Javascript
Bootstrap Table列宽拖动的方法
Aug 15 Javascript
使用Sonarqube扫描Javascript代码的示例
Dec 26 Javascript
Jquery+javascript实现支付网页数字键盘
Dec 21 jQuery
vue穿梭框实现上下移动
Jan 29 Vue.js
用Javascript实现发送短信验证码间隔功能
Feb 08 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
Dec 13 #Javascript
javascript对HTML字符转义与反转义
Dec 13 #Javascript
Web安全之XSS攻击与防御小结
Dec 13 #Javascript
JavaScript实现邮箱后缀提示功能的示例代码
Dec 13 #Javascript
深入理解js A*寻路算法原理与具体实现过程
Dec 13 #Javascript
Vue.js上传图片到阿里云OSS存储的方法示例
Dec 13 #Javascript
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
Dec 13 #Javascript
You might like
php 文件夹删除、php清除缓存程序
2009/08/25 PHP
深入解析PHP垃圾回收机制对内存泄露的处理
2013/06/14 PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
2013/08/15 PHP
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
2016/02/27 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
DIV菜单层实现代码
2010/11/19 Javascript
javascript打印大全(打印页面设置/打印预览代码)
2013/03/29 Javascript
浅析用prototype定义自己的方法
2013/11/14 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
2017/01/04 Javascript
nodejs+websocket实时聊天系统改进版
2017/05/18 NodeJs
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
实现Vue的markdown文档可以在线运行的方法示例
2018/12/11 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
2019/01/27 jQuery
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
eslint 的三大通用规则详解
2019/05/16 Javascript
浅谈Vue组件单元测试究竟测试什么
2020/02/05 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
python网络编程调用recv函数完整接收数据的三种方法
2017/03/31 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
基于python的多进程共享变量正确打开方式
2018/04/28 Python
django实现用户注册实例讲解
2019/10/30 Python
Python loguru日志库之高效输出控制台日志和日志记录
2020/03/07 Python
Python操作Excel把数据分给sheet
2020/05/20 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
Omio法国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/13 全球购物
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
UNOde50美国官网:西班牙珠宝品牌
2020/08/15 全球购物
电大物流学生的自我评价
2013/10/25 职场文书
中班幼儿评语大全
2014/04/30 职场文书
罚款通知怎么写
2015/04/22 职场文书
负责培养人意见
2015/06/05 职场文书
如何书写先进事迹材料?
2019/07/02 职场文书