视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Vuex的actions属性的具体使用
2020-11-27 21:58:41 责编:小采
文档


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 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

下载本文
显示全文
专题