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 相关文章推荐
点击文章内容处弹出页面代码
Oct 01 Javascript
extjs 学习笔记(三) 最基本的grid
Oct 15 Javascript
javascript中直接写php代码的方法
Jul 31 Javascript
JS防止用户多次提交的简单代码
Aug 01 Javascript
javaScript arguments 对象使用介绍
Oct 18 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
Dec 24 Javascript
JQuery中$.each 和$(selector).each()的区别详解
Mar 13 Javascript
JQuery学习总结【一】
Dec 01 Javascript
100行代码理解和分析vue2.0响应式架构
Mar 09 Javascript
ReactNative列表ListView的用法
Aug 02 Javascript
判断jQuery是否加载完成,没完成继续判断的解决方法
Dec 06 jQuery
Puppeteer 爬取动态生成的网页实战
Nov 14 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
在PHP中使用与Perl兼容的正则表达式
2006/11/26 PHP
PHP随机字符串生成代码(包括大小写字母)
2013/06/24 PHP
新浪微博OAuth认证和储存的主要过程详解
2015/03/27 PHP
深入理解JSON数据源格式
2014/01/10 Javascript
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
jQuery实现美观的多级动画效果菜单代码
2015/09/06 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
node.js express中app.param的用法详解
2017/07/16 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
vue 实现全选全不选的示例代码
2018/03/29 Javascript
JavaScript轮播停留效果的实现思路
2018/05/24 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
Python的Django框架中if标签的相关使用
2015/07/15 Python
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
Python中的并发处理之asyncio包使用的详解
2018/04/03 Python
python 处理dataframe中的时间字段方法
2018/04/10 Python
python selenium 获取标签的属性值、内容、状态方法
2018/06/22 Python
python实现大转盘抽奖效果
2019/01/22 Python
python 批量修改 labelImg 生成的xml文件的方法
2019/09/09 Python
在Python中等距取出一个数组其中n个数的实现方式
2019/11/27 Python
python3 实现函数写文件路径的正确方法
2019/11/27 Python
详解python metaclass(元类)
2020/08/13 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
html5/css3响应式页面开发总结
2018/10/16 HTML / CSS
Reebok俄罗斯官方网上商店:购买锐步运动服装和鞋子
2016/09/26 全球购物
美国市场上最实惠的送餐服务:Dinnerly
2018/03/18 全球购物
什么样的创业计划书可行性高?
2014/02/01 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
放飞理想主题班会
2015/08/14 职场文书
Springboot使用Spring Data JPA实现数据库操作
2021/06/30 Java/Android
欧元符号 €
2022/02/17 杂记