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 相关文章推荐
15 个 JavaScript Web UI 库
May 19 Javascript
关于juqery radio写法的兼容性问题(新老版本jquery)
Jun 14 Javascript
一个报数游戏js版(约瑟夫环问题)
Aug 05 Javascript
javascript开发随笔一 preventDefault的必要
Nov 25 Javascript
js弹出确认是否删除对话框
Mar 27 Javascript
JQuery控制Radio选中方法分析
May 29 Javascript
分享网页检测摇一摇实例代码
Jan 14 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
Aug 09 Javascript
js判断价格,必须为数字且不能为负数的实现方法
Oct 07 Javascript
微信小程序网络请求的封装与填坑之路
Apr 01 Javascript
JS中IP地址与整数相互转换的实现代码
Apr 10 Javascript
vue-cli3 从搭建到优化的详细步骤
Jan 20 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
destoon常用的安全设置概述
2014/06/21 PHP
PHP中trim()函数简单使用指南
2015/04/16 PHP
php数组分页实现方法
2016/04/30 PHP
php获取访问者浏览页面的浏览器类型
2017/01/23 PHP
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
jquery解析xml字符串简单示例
2014/04/11 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
JavaScript阻止回车提交表单的方法
2015/12/30 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
jquery mobile 实现自定义confirm确认框效果的简单实例
2016/06/17 Javascript
js 声明数组和向数组中添加对象变量的简单实例
2016/07/28 Javascript
form表单转Json提交的方法(推荐)
2016/09/23 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
2019/01/08 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
实例讲解React 组件生命周期
2020/07/08 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
python正则表达式去掉数字中的逗号(python正则匹配逗号)
2013/12/25 Python
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
Python制作简单的网页爬虫
2015/11/22 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
Python实现判断给定列表是否有重复元素的方法
2018/04/11 Python
python实现简易淘宝购物
2019/11/22 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
2020/08/07 Python
python中pop()函数的语法与实例
2020/12/01 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
计算机应用专业毕业生求职信
2013/10/24 职场文书
新员工欢迎词
2014/01/12 职场文书
放飞蜻蜓反思
2014/02/05 职场文书
出国签证在职证明
2014/09/20 职场文书
信访稳定工作汇报
2014/10/27 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书