浅谈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 相关文章推荐
tbody元素支持嵌套的注意方法
Mar 24 Javascript
超简单的jquery的AJAX用法
May 10 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
Apr 09 Javascript
jquery增加和删除元素的方法
Jan 14 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
Jun 21 Javascript
微信小程序基础教程之worker线程的使用方法
Jul 15 Javascript
解决$store.getters调用不执行的问题
Nov 08 Javascript
vue 使用v-for进行循环的实例代码详解
Feb 19 Javascript
Node.js API详解之 assert模块用法实例分析
May 26 Javascript
js实现星星打分效果
Jul 05 Javascript
js实现缓动动画
Nov 25 Javascript
一篇文章了解正则表达式的替换技巧
Feb 24 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设计模式 Command(命令模式)
2011/06/26 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
orm获取关联表里的属性值
2016/04/17 PHP
Laravel框架实现多个视图共享相同数据的方法详解
2019/07/09 PHP
php数组指针函数功能及用法示例
2020/02/11 PHP
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
css样式标签和js语法属性区别
2013/11/06 Javascript
javascript实现信息的显示和隐藏如注册页面
2013/12/03 Javascript
NodeJS Web应用监听sock文件实例
2015/02/18 NodeJs
jquery实现列表上下移动功能
2016/02/25 Javascript
jQuery实现底部浮动窗口效果
2016/09/07 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
2018/08/18 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
2020/04/17 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
Python通过RabbitMQ服务器实现交换机功能的实例教程
2016/06/29 Python
对python requests发送json格式数据的实例详解
2018/12/19 Python
Python实现的爬取百度文库功能示例
2019/02/16 Python
pandas读取csv文件提示不存在的解决方法及原因分析
2020/04/21 Python
CSS3系列教程:背景图片(背景大小和多背景图) 应用说明
2012/12/19 HTML / CSS
纯CSS3绘制打火机动画火焰效果
2016/07/18 HTML / CSS
CSS3实现苹果手机解锁的字体闪亮效果示例
2021/01/05 HTML / CSS
Agoda.com官方网站:便宜预订全球酒店,高达80%的折扣
2018/04/04 全球购物
美国滑雪板和装备购物网站:Skis.com
2018/12/20 全球购物
介绍一下Ruby的多线程处理
2013/02/01 面试题
校园文化建设方案
2014/02/03 职场文书
财务部总监岗位职责
2014/03/12 职场文书
祖国在我心中的演讲稿
2014/05/04 职场文书
安全责任书模板
2014/07/22 职场文书
2014年远程教育工作总结
2014/12/09 职场文书
2015教师节师德演讲稿
2015/03/19 职场文书
2016三八妇女节校园广播稿
2015/12/17 职场文书
实习员工转正的评语汇总,以备不时之需
2019/12/17 职场文书
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js