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 相关文章推荐
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
Jun 26 Javascript
一些易混淆且不常用的属性,希望有用
Jan 29 Javascript
jquery操作select大全
Apr 25 Javascript
Javascript使用post方法提交数据实例
Aug 03 Javascript
深入浅析JavaScript函数前面的加号和叹号
Jul 09 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
Aug 19 Javascript
js实现表格筛选功能
Jan 18 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
May 13 jQuery
js变量值传到php过程详解 将php解析成数据
Jun 26 Javascript
Vue项目中如何使用Axios封装http请求详解
Oct 23 Javascript
浅谈vue 锚点指令v-anchor的使用
Nov 13 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
Oct 24 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 魔术函数使用说明
2010/02/21 PHP
8个出色的WordPress SEO插件收集
2011/02/26 PHP
PHP面向对象概念
2011/11/06 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
PHP中上传多个文件的表单设计例子
2014/11/19 PHP
PHP使用PDO 连接与连接管理操作实例分析
2020/04/21 PHP
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
用js闭包的方法实现多点标注冒泡示例
2014/05/29 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
2016/12/23 Javascript
vue-router 中router-view不能渲染的解决方法
2017/05/23 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
微信小程序页面滑动屏幕加载数据效果
2020/11/16 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
基于wordpress的ajax写法详解
2018/01/02 Javascript
Vue 表情包输入组件的实现代码
2019/01/21 Javascript
配置一个vue3.0项目的完整步骤
2019/04/26 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
2020/04/11 Javascript
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
Python实现的端口扫描功能示例
2018/04/08 Python
python3.4实现邮件发送功能
2018/05/28 Python
Django配置celery(非djcelery)执行异步任务和定时任务
2018/07/16 Python
python交互模式下输入换行/输入多行命令的方法
2019/07/02 Python
Django 路由层URLconf的实现
2019/12/30 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
2020/11/24 Python
英文导游欢迎词
2014/01/11 职场文书
英语专业自荐书
2014/06/13 职场文书
食品安全演讲稿
2014/09/01 职场文书
三好学生竞选稿
2015/11/21 职场文书
postgresql中如何执行sql文件
2023/05/08 PostgreSQL