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 相关文章推荐
js 分页全选或反选标识实现代码
Aug 09 Javascript
js创建一个input数组并绑定click事件的方法
Jun 12 Javascript
jQuery后代选择器用法实例
Dec 23 Javascript
Jquery ajax基础教程
Nov 20 Javascript
如何使用jquery修改css中带有!important的样式属性
Apr 28 Javascript
Iscrool下拉刷新功能实现方法(推荐)
Jun 26 Javascript
微信小程序 循环及嵌套循环的使用总结
Sep 26 Javascript
浅谈Vue响应式(数组变异方法)
May 07 Javascript
面试题:react和vue的区别分析
Apr 08 Javascript
使用Vant完成通知栏Notify的提示操作
Nov 11 Javascript
vue 计算属性和侦听器的使用小结
Jan 25 Vue.js
vue-cli4.5.x快速搭建项目
May 30 Vue.js
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
php数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
2014/09/27 PHP
windows下apache搭建php开发环境
2015/08/27 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
IE的事件传递-event.cancelBubble示例介绍
2014/01/12 Javascript
jQuery scroll事件实现监控滚动条分页示例
2014/04/04 Javascript
jQuery中parentsUntil()方法用法实例
2015/01/07 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
JavaScript与ActionScript3两者的同性与差异性
2016/09/22 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
Bootstrap4如何定制自己的颜色和风格
2018/02/26 Javascript
vue和webpack项目构建过程常用的npm命令详解
2018/06/15 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
js实现复制粘贴的两种方法
2020/12/04 Javascript
JavaScript实现打字游戏
2021/02/19 Javascript
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
10个易被忽视但应掌握的Python基本用法
2015/04/01 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
python书籍信息爬虫实例
2018/03/19 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
python生成九宫格图片
2018/11/19 Python
使用python进行拆分大文件的方法
2018/12/10 Python
python用match()函数爬数据方法详解
2019/07/23 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
python实现单张图像拼接与批量图片拼接
2020/03/23 Python
tensorflow实现将ckpt转pb文件的方法
2020/04/22 Python
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
程序员岗位职责
2013/11/11 职场文书
学生干部的自我评价分享
2014/01/18 职场文书
小学兴趣小组活动总结
2014/07/07 职场文书
小学教师师德师风自我剖析材料
2014/09/29 职场文书
十二生肖观后感
2015/06/12 职场文书
OpenCV 图像梯度的实现方法
2021/07/25 Python