Vuex的actions属性的具体使用


Posted in Javascript onApril 14, 2019

Vuex 的 action 属性内,可以定义异步操作逻辑,以满足某些业务场景要求。在组件内,是通过 $store.dispatch 来触发 action 定义的函数。

我们使用 action,来为计数器异步增 1。

1 Promise 方式

main.js:

const store = new Vuex.Store({
  state: {
    count: 0,
  },
  mutations: {
    increment(state, n = 1) {
      state.count += n;
    }
  },
  actions: {
    asyncInrement(context) {
      return new Promise(resolve => {
        setTimeout(() => {
          context.commit('increment');
          resolve();
        }, 1000)
      });
    }
  }
});

这里使用了 Promise ,在 1 s 后提交了 mutations 中定义的 increment 递增函数。它是 ES6 语法,有三种状态:

状态 说明
Pending 进行中
Resolved 已完成
Rejected 失败

 index.vue:

<template>

  <div>
    {{count}}
    <button @click="asyncIncrementByAction">+1</button>
  </div>
</template>

<script>
  export default {
    name: "index.vue",
    computed: {
      count() {
        return this.$store.state.count;
      }
    },
    methods: {
      asyncIncrementByAction() {
        this.$store.dispatch('asyncInrement').then(() => {
          console.log(this.$store.state.count);
        })
      }
    }
  }
</script>

2 Callback 方式

也可以使用普通回调来实现异步方案。

main.js

const store = new Vuex.Store({
...
  actions: {
   ...
    asyncInrement2(context, callback) {
      setTimeout(() => {
        context.commit('increment');
        callback();
      }, 1000);
    }
  }
});

index.vue:

<template>
  <div>
    ...
    {{count}}
    <button @click="asyncIncrementByAction2">+1(Callback)</button>
  </div>
</template>

<script>
  export default {
    ...
    methods: {
      ...
      asyncIncrementByAction2() {
        this.$store.dispatch('asyncInrement2',() => {
          console.log(this.$store.state.count);
        });
      }
    }
  }
</script>

3 效果

Vuex的actions属性的具体使用

vuex action和mutations的区别

action的功能和mutation是类似的,都是去变更store里的state,不过action和mutation有两点不同:

1、action主要处理的是异步的操作,mutation必须同步执行,而action就不受这样的限制,也就是说action中我们既可以处理同步,也可以处理异步的操作

2、action改变状态,最后是通过提交mutation

使用方式: 

安装:

npm install vuex --save

引用:

store.js

方法一:

/**
 * 创建完文件后需要去到main.js中引入成全局
 */
import Vue from "vue";
import Vuex from "vuex";
//使用vuex
Vue.use(Vuex);
const state = {
 targetUser: {} //用户详细资料数据
};
 
const getters = {
 //获取到用户状态,//实时监听state值的变化(最新状态)
 targetUser: state => state.targetUser
};
 
const mutations = {
 //自定义改变state初始值的方法
 SET_TARGET_USER(state, targetUser) {
  if (targetUser) {
   state.targetUser = targetUser; //如果targetUser有内容就赋给状态信息
  } else {
   //如果没内容就给targetUser赋空对象
   state.targetUser = {};
  }
 }
};
 
const actions = {
 //这里面的方法是用来异步触发mutations里面的方法,context与store 实例具有相同方法和属性
 // 页面定义的setGargetUser,targetUser为页面传过来的值
 setGargetUser({ commit }, targetUser) {
  commit("SET_TARGET_USER", targetUser);
 }
};

存储页面:

this.$store.dispatch('setGargetUser',friend)

获取页面:

computed:{
    // 提示vuex中存入的用户详细资料
    targetUser(){
      return this.$store.getters.targetUser
    }
   },

以上方法有一个问题就是如果多人开发;会出现不利于管理,下面用一个方法定义一个常量

存储:

this.$store.dispatch('setUser',decode)

store.js

/**
 * 创建完文件后需要去到main.js中引入成全局
 */
import Vue from "vue";
import Vuex from "vuex";
// 持久存储插件
import createPersistedState from "vuex-persistedstate";
 
//使用vuex
Vue.use(Vuex);
 
/**
 * 在需要多人协作的项目中,我们可以使用常量代替mutation 事件类型。这在各种 Flux 实现中是很常见的模式。同时把这些常量放在单独的文件中可以让协作开发变得清晰。
 * 定义存储信息
 *
 *  */
 
const types = {
 SET_TARGET_USER: "SET_TARGET_USER" //详细资料
};
 
const state = {
 //用户初始化的状态
 targetUser: {} //用户详细资料数据
};
const getters = {
 //获取到用户状态,//实时监听state值的变化(最新状态)
 targetUser: state => state.targetUser
};
const mutations = {
 //自定义改变state初始值的方法
 
 [types.SET_TARGET_USER](state, targetUser) {
  if (targetUser) {
   state.targetUser = targetUser; //如果targetUser有内容就赋给状态信息
  } else {
   //如果没内容就给targetUser赋空对象
   state.targetUser = {};
  }
 }
};
 
const actions = {
 //这里面的方法是用来异步触发mutations里面的方法,context与store 实例具有相同方法和属性
 setGargetUser({ commit }, targetUser) {
  commit(types.SET_TARGET_USER, targetUser);
  // localStorage.setItem("SET_TARGET_USER", JSON.stringify(targetUser));
 }
};
export default new Vuex.Store({
 state,
 mutations,
 getters,
 actions,
});

取值:

this.$store.getters.targetUser

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

Javascript 相关文章推荐
jquery 上下滚动广告
Jun 17 Javascript
Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
Apr 02 Javascript
jQuery数据缓存功能的实现思路及简单模拟
May 27 Javascript
Highcharts 非常实用的Javascript统计图demo示例
Jul 03 Javascript
jQuery模拟黑客帝国矩阵效果实例
Jun 28 Javascript
不用一句js代码初始化组件
Jan 27 Javascript
JavaScript实现的MD5算法完整实例
Feb 02 Javascript
Javascript实现的StopWatch功能示例
Jun 13 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
Jul 23 Javascript
js中时间格式化的几种方法
Jul 22 Javascript
JavaScript实时更新当前的时间的示例代码
Jul 15 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
Nov 12 Javascript
vue全局自定义指令-元素拖拽的实现代码
Apr 14 #Javascript
vue自定义指令之面板拖拽的实现
Apr 14 #Javascript
详解Vue组件之间通信的七种方式
Apr 14 #Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
Apr 14 #Javascript
vue使用axios上传文件(FormData)的方法
Apr 14 #Javascript
详解如何理解vue的key属性
Apr 14 #Javascript
axios+Vue实现上传文件显示进度功能
Apr 14 #Javascript
You might like
风格模板初级不完全修改教程
2006/10/09 PHP
php操作mysqli(示例代码)
2013/10/28 PHP
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
PHP解压tar.gz格式文件的方法
2016/02/14 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
JS中类或对象的定义说明
2014/03/10 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2014/09/04 Javascript
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
nodejs初步体验篇
2015/11/23 NodeJs
jQuery数据类型小结(14个)
2016/01/08 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
jquery easyui DataGrid简单示例
2017/01/23 Javascript
原生js实现放大镜
2017/02/20 Javascript
AngularJs 终极购物车(实例讲解)
2017/11/08 Javascript
在Vue中使用this.$store或者是$route一直报错的解决
2019/11/08 Javascript
Python 时间处理datetime实例
2008/09/06 Python
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
同时安装Python2 &amp; Python3 cmd下版本自由选择的方法
2017/12/09 Python
详解Python如何生成词云的方法
2018/06/01 Python
python opencv实现切变换 不裁减图片
2018/07/26 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
美国在线宠物用品商店:Entirely Pets
2017/01/01 全球购物
台湾前三大B2C购物网站:MOMO购物网
2017/04/27 全球购物
学习雷锋精神心得体会范文
2014/03/12 职场文书
大学英语专业求职信
2014/06/21 职场文书
幼儿园大班开学寄语
2014/08/02 职场文书
户籍证明格式
2014/09/15 职场文书
刑事和解协议书范本
2014/11/19 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
期中考试后的感想
2015/08/07 职场文书
python缺失值的解决方法总结
2021/06/09 Python
python自动化八大定位元素讲解
2021/07/09 Python