一、问题的起源

最近在做vue.js项目时,遇到了vuex状态管理action与vue.js方法互相通信、互操作的问题。场景如下图所示:

二、第一种解决方法

例如,我们在页面初始化的时候,需要从服务端通过API接口获取数据,数据获取成功前需要显示Loading状态框,数据获取完成后,需要将Loading状态框隐藏。

这是一种相对比较简单的应用场景,解决起来当然也比较简单。

我们可以通过state数据字段来实现,在state中存储一个loading字段,并设置默认值为false。

const store = new Vuex.Store({
state: {
loading: false
},
// ......
});

因为要对state.loading进行操作,所以,我们需要定义一个mutation方法,用于更新loading状态数据。

const UPDATE_LOADING = 'updateLoading';

const store = new Vuex.Store({
// ......,
mutations: {
updateLoading (state, loading) {
state.loading = loading;
}
},
// ......
});

然后,我们声明一个action方法,用于从HTTP API获取数据。

const store = new Vuex.Store({
// ......,
actions: {
fetchData ({ commit }) {
commit(UPDATE_LOADING, true);
axios.get('...', { params: {...} })
.then(res => {
// TODO 解析HTTP响应数据,进行相关的业务逻辑处理
})
.catch(err => {
// TODO 进行相关的错误与异常处理
})
.finally(() => {
commit(UPDATE_LOADING, false);
});
}
},
// ......
})

在页面模板中,我们通过mapActions函数将vuex的action方法映射为vue.js中对象的方法。

import { mapActions } from 'vuex'

export default {
// ...
methods: {
...mapActions([
'fetchData',
// ...
])
}
}

最后,在vue.js的mounted生命周期方法中调用通过mapActions映身的方法fetchData即可。

export default {
// ...,
mounted() {
this.fetchData();
},
// ...
}

三、第二种解决方法

上述的第一种解决方法,可以通过mutation修改state的状态数据控制UI上的数据渲染。但如果想要将获取到的结果数据传到UI组件是不行的,另外,如果想要在调用action方法执行完成后在UI中再去做一些事情也是行不通的。

以前我们知道,异步方法传递数据,可以通过回调函数的参数进行传递数据,所以,我提到的第二种解决办法就是通过回调函数实现的。

const store = new Vuex.Store({
// ......,
actions: {
fetchData ({ commit }, { params, callback }) {
commit(UPDATE_LOADING, true);
axios.get('...', { params })
.then(res => {
callback(res);
})
.catch(err => {
// TODO 进行相关的错误与异常处理
})
.finally(() => {
commit(UPDATE_LOADING, false);
});
}
},
// ......
})

四、第三种解决方法

以上两种方式虽然可以解决某些问题,但解决方法不够优雅,而且第一种方法具有很大的局限性。比如,不能回调主界面中的方法执行后续的操作,也不能自由地传递参数。第二种方法采用回调可以调用方法,也可以传参,但callback的调用是同步方式,代码风格也不是很好。所以,我比较提倡大家使用第三种方法,就是在action调用时返回一个Promise,这样在主界面就可以拿到这个promise对象,并进行链式执行后续的任务,也可以将action异步任务的结果数据传递给主UI。

const store = new Vuex.Store({
// ......,
actions: {
fetchData ({ commit }, { params }) {
commit(UPDATE_LOADING, true);
return axios.get('...', { params })
.then(res => {
const { data } = res;
return data;
})
.finally(() => {
commit(UPDATE_LOADING, false);
});
}
},
// ......
})

在主UI中,我们就可以采用如下的方式进行后续的操作。

export default {
// ...,
mounted() {
this.fetchData({ id: 1 })
.then(res => {
// TODO 执行后续的任务
})
.catch(err => {
// TODO 处理异常情况
});
},
// ...
}

前端技术之:如何在vuex状态管理action异步调用结束后执行UI中的方法的更多相关文章

  1. 前端MVC Vue2学习总结(八)——Vue Router路由、Vuex状态管理、Element-UI

    一.Vue Router路由 二.Vuex状态管理 三.Element-UI Element-UI是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是 Mint U ...

  2. 前端Vue框架-vuex状态管理详解

    新人报道!多多关照-多提宝贵意见 谢谢- vuex理解 采用集中式存储管理模式.用来管理组件的状态,并以自定义规则去观测实时监听值得变化. 状态模式管理理解 属性 理解 state 驱动应用的数据源 ...

  3. VueX状态管理器 的应用

    VueX状态管理器 cnpm i vuex axios -S 1 创建Vuex 仓库 import Vue from 'vue' import Vuex from 'vuex' vue.use(Vue ...

  4. vuex状态管理-数据改变不刷新

    困惑: 在页面初始化的时候,我提交到vuex状态管理,然后在获取的时候获取不到,我找到了出错的地点,并进行了修改,然后可以获取到状态 但是不知道原因? 定义了如下的state const state ...

  5. vuex状态管理demo

    vuex状态管理主要包含四个概念  mapState,mapMutations,mapGetters,mapActions. 编写vuex文件夹下面的store.js import Vue from ...

  6. vue第十八单元(单向数据流 vuex状态管理)

    第十八单元(单向数据流 vuex状态管理) #课程目标 1.理解什么是数据管理模式 2.什么是vuex 3.什么时候使用vuex 4.vuex安装及工作原理 5.vuex语法 #知识点 1.首先来看下 ...

  7. Vuex 状态管理的工作原理

    Vuex 状态管理的工作原理 为什么要使用 Vuex 当我们使用 Vue.js 来开发一个单页应用时,经常会遇到一些组件间共享的数据或状态,或是需要通过 props 深层传递的一些数据.在应用规模较小 ...

  8. vue 通信:父子通信、兄弟通信、跨多层通信、vuex状态管理

    之前简单做了一次vue通信方法的培训,在此记录一下培训的内容. 关于vue通信,大家最先想到的方法应该是props.ref.$emit.$parent,还有vuex,因为这也是我在项目中最常用到的方法 ...

  9. 前端MVC Vue2学习总结(九)——Vuex状态管理插件

    一.概要 1.1.Vuex定义与注意事项 Vuex是为vue.js框架更好的管理状态而设计一个插件.Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的 ...

随机推荐

  1. jQuery常用方法(四)-选择器

    JQuery Selectors 方法说明 基本选择器 $("#myDiv") 匹配唯一的具有此id值的元素 $("div") 匹配指定名称的所有元素 $(&q ...

  2. 谷歌助力,快速实现 Java 应用容器化

    原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」.一群同频者,一起成长,一起精进,打破认知的局限性. Google 在 2018 年下旬开源 ...

  3. css 精灵图的使用

    精灵图的使用 1.给一个容器定义一个大小(宽高) 2.引入背景图 3.定位到自己你想要的图片位置 例如:  background-position: 0 0;  background-position ...

  4. kubeadm部署高可用集群Kubernetes 1.14.1版本

    Kubernetes高可用集群部署 部署架构: Master 组件: kube-apiserver Kubernetes API,集群的统一入口,各组件协调者,以HTTP API提供接口服务,所有对象 ...

  5. Scala 学习笔记之函数(3)

    class student{ def sayHello(name: => String){ println(s"Hello, $name, welcome $name") } ...

  6. Scala 学习笔记之函数(1)

    class Student { val mySayHello1: String => Unit = sayHello val mySayHello2: (String, Int) => U ...

  7. 面试|简单描述MySQL中,索引,主键,唯一索引,联合索引 的区别,对数据库的性能有什么影响(从读写两方面)

    索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们 包含着对数据表里所有记录的引用指针. 普通索引(由关键字 KEY 或 INDEX 定义的索引)的唯一任务是加快对数据的 ...

  8. Eclipse导入别人项目爆红叉

    1.导入项目之前,请确认工作空间编码已设置为utf-8:window->Preferences->General->Wrokspace->Text file encoding- ...

  9. Python PDB调试处理

    pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等.pdb 提供了 ...

  10. 第三方登录之GitHub篇

    第一步,准备工作.获取Client ID和Client Secret 1.自行登陆GitHub官网,点击Setting,如下图: 2.继续,点击Developer settings,如下图: 3.继续 ...