vue之mapMutations的使用

  我们通过Mutation来改变store中的state,方法往往是在子组件中使用 this.$store.commit(); 来实现,但是这样的缺点是不容易查看,并且每次在调用Mutations时都需要添加 $store, 为了方便我们的开发,所以可以使用 mapMutations ,正如对于state, 我们可以使用 mapState 是一样的 。  

  首先,在mutation-type.js 中的内容大致如下:

export const INCREMENT_NUMBER = "INCREMENT_NUMBER"
export const DECREMENT_NUMBER = "DECREMENT_NUMBER"
export const INCREMENT_PRICE = "INCREMENT_PRICE"
export const DECREMENT_PRICE = "DECREMENT_PRICE"
export const UPDATE_MALL = "UPDATE_MALL"
export const UPDATE_PERSON = "UPDATE_PERSON"
export const UPDATE_CONTENT = "UPDATE_CONTENT"
export const UPDATE_KINDS = "UPDATE_KINDS"

  使用大写,这样我们可以更容易进行区分。

  

  接着,我们引入:

import {
INCREMENT_NUMBER,
DECREMENT_NUMBER,
INCREMENT_PRICE,
DECREMENT_PRICE,
UPDATE_MALL,
UPDATE_PERSON,
UPDATE_CONTENT,
UPDATE_KINDS
} from './mutation-types.js'

  

  然后就可以在 store 实例下定义了:

  mutations: {
[INCREMENT_NUMBER] (state) {
state.totalNumber++;
},
[DECREMENT_NUMBER] (state) {
state.totalNumber--;
},
[INCREMENT_PRICE] (state, unitPrice) {
state.totalPrice += unitPrice;
},
[DECREMENT_PRICE] (state, unitPrice) {
state.totalPrice -= unitPrice;
},

  完成了这些基本工作之后,我们就可以在组件中使用:

import {mapMutations} from "vuex"

  然后在 methods 下定义,例如:

     ...mapMutations([
'UPDATE_CONTENT', "UPDATE_KINDS"
]),

  这样,我们在使用的时候,用this即可。

 that.UPDATE_CONTENT(response.data.data);

  这里使用了that是因为,如果使用this指向的不是vue实例,之前我们会 var that = this; 这样就没有问题了 。

vue中action的用法

  在知乎上,有人问了这么一个问题:

  这个问题问的非常好! 额,因为这就是我想问的问题。。。

有以下几种解决方式:

第一:

  最高票答案的方法是把所有和服务器端的交互都写在 actions 中, 而业务代码里,就只有对actions的异步操作。

  也就是说: axios相关代码写在actions中, 在.vue文件中来触发actions。 

  总体的设计原则是actions是异步的,用来处理业务逻辑的, 而mutation只是简单的对state的状态进行改变。

  以上是说第一个问题。

  而第二个问题最高票认为: 先处理好返回数据,然后将返回数据触发 mutations。

  你可以把state 理解为前端的共用数据库, mutations 这些是增删改,getters 是查,所以mutations 里的逻辑应该是越少越好。 

  

第二:

  有人建议新建一个service层(当然是在src中),在其中添加一个api.js(或者getData.js)用于请求数据。 然后将接口导出即可。

  

我的观点: 不管是哪种原则,其实都是为了方便我们进行编码而设计的, 并且我单独列出来上述答案,是因为我觉得他们有相同之处, 比如我们确实应当将异步的请求写在actions中,而actions中如果写了太多的 axios 请求逻辑也会显得十分繁琐,所以,我们这时就需要添加一个 service 层,该层中添加 api.js ,用于调用其中的接口。参考代码

  

好处:  

  • 如果需要改请求,我们直接进入service层进行修改即可。
  • 如果需要修改异步调用,直接进入actions中修改即可。

即通过代码的有效整理后,逻辑性更加清楚, 而不会造成混乱。

  

vue中mapActions的使用

  使用mapActions的方法大致和mapMutations的方法相同,现在简单介绍如下。

  我们知道使用actions的目的就是用来处理异步的操作。

比如: 我们获取一个用户信息,使用axios发送http请求,这里使用actions。

第一: 因为actions的本质是提交mutations,所以:

import {
UPDATE_PERSON,
} from './mutation-types.js'

  然后:

 mutations: {

    [UPDATE_PERSON] (state, curPerson) {
state.curPerson = curPerson;
}, },

  这样,mutations 的相关工作就做好了。

第二:定义actions, 使用action, 方法中一般都是要有异步的请求的,否则就没有使用action的必要了.

  actions: {
updatePerson ({commit, state}) {
axios.get('/bbg/user/user_base_info', {
params: {
uid:
}
}).then(function (response) {
if (response.data.code == ) {
commit(UPDATE_PERSON, response.data.data);

}
});
},
}

  这里比较重要的就是 commit 了,可以看到在updatePerson中,我们传递的参数一般是{commit, state}, 当请求结束之后,我们就可以commit了。

注意

  在action中对commit mutations时,一般都只接受两个参数,第一个参数是 mutations 中的名称,第二个参数是我们需要向mutations传递的值,这个值往往是通过异步的http请求获得的值和其他相关值,对于传递多个参是不支持的,所以我们的做法就是将多个参数封装到多个参数中,这样不就可以了吗!!! 如下所示:

if (response.data.code == ) {
for (let i = ; i < response.data.data.length; i++) {
console.log(response.data.data[i], index);
var obj = {
index: index,
item: response.data.data[i]
};
commit(UPDATE_ALL_CONTENT, obj); }
index++;
resolve();
}

第三: 使用

import {mapActions} from "vuex"

同mapMutations一样,先从vuex中引入。

在methods下设置:

  methods: {
...mapActions([
'updatePerson'
]),

最后,当用户点击按钮或。。

      getPerson: function () {
this.updatePerson();
}

  即直接使用 this.updatePerson() 来调用。 和 mutations 的调用非常类似,只是actions在中间加了一层异步的方法。

说明: 使用actions时也是可以传递参数的,比如这里: this.updatePerson("参数"), 然后updatePerson ({commit, state}, str) 这种形式就可以接收到参数了。

当然可以也是可以传递payLoad的,比如 updatePerson({commit, state}, payload) 然后我们在函数中使用payload.foo、payload.bar即可。  

参考代码:

https://github.com/bailicangdu/vue2-elm/tree/master/src

https://github.com/bailicangdu/vue2-elm/blob/master/src/page/confirmOrder/confirmOrder.vue

参考文章:

https://www.zhihu.com/question/57133837

vue之mapMutaions的使用 && vuex中 action 用法示例 && api.js的使用的更多相关文章

  1. 【vue】vue +element 搭建项目,vuex中的store使用

    概述: 每一个 Vuex 应用的核心就是 store(仓库).“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state).Vuex 和单纯的全局对象有以下两点不同: Vuex 的 ...

  2. SQL中ISNULL用法示例

    ISNULLSQL查询示例SELECT ISNULL    使用指定的替换值替换 NULL. 语法       :ISNULL ( check_expression , replacement_val ...

  3. Android中SurfaceView用法示例

    SurfaceView在游戏开发中有着举足轻重的地位,它对于画面的控制有着更大的自由度(不像View要用handler来更新,关于View的),但这方面的参考资料并不是太多,能找到的例子都有点喧宾夺主 ...

  4. Python3基础 yield 在函数中的用法示例

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  5. 循序渐进VUE+Element 前端应用开发(2)--- Vuex中的API、Store和View的使用

    在我们开发Vue应用的时候,很多时候需要记录一些变量的内容,这些可以用来做界面状态的承载,也可以作为页面间交换数据的处理,处理这些内容可以归为Vuex的状态控制.例如我们往往前端需要访问后端数据,一般 ...

  6. vue常见问题处理 -- 页面刷新时,如何保持原有vuex中的state信息

    一.页面刷新时,如何保持原有vuex中的state信息 页面刷新后,原有的 vuex 中的 state 会发生改变,如果在页面刷新之前,可以将 state 信息保存,页面重新加载时,再将该值赋给 st ...

  7. Vue刷新页面VueX中数据清空了,怎么重新获取?

    Vue刷新页面VueX数据清空了,怎么重新获取? 点击打开视频讲解更详细 在vue中刷新页面后,vuex中的数据就没有了,这时我们要想使用就要重新获取数据了, 怎么在刷新后重新获取数据呢??? 这时我 ...

  8. Vue(二十三)vuex + axios + 缓存 运用 (以登陆功能为例)

    (一)axios 封装 (1)axios拦截器 可以在axios中加入加载的代码... (2)封装请求 后期每个请求接口都可以写在这个里面... (二)vuex user.js import { lo ...

  9. 理解Vue的状态管理模式Vuex

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 状态管理模式.集中式存储管理,一听就很高大 ...

随机推荐

  1. Service Fabric 用 Powershell 部署应用到本地

    前置说明 安装 Service Fabric SDK,会在本机 C:\Program Files\Microsoft SDKs\Service Fabric\Tools\PSModule\Servic ...

  2. visual studio installer 卸载时不能删除安装目录问题

      在vs中可以制作安装程序,但是这个安装程序默认卸载的时候不会把安装目录卸载,如果想在卸载的时候删除这个目录,那就要费点周折了.此方法同时适应于程序自删除以及工作目录删除. 基本思路是在程序要退出的 ...

  3. 死磕Java之聊聊ArrayList源码(基于JDK1.8)

    工作快一年了,近期打算研究一下JDK的源码,也就因此有了死磕java系列 ArrayList 是一个数组队列,相当于动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractLis ...

  4. LOJ#10106. 「一本通 3.7 例 2」单词游戏

    题目链接:https://loj.ac/problem/10106 题目描述 来自 ICPC CERC 1999/2000,有改动. 有 NNN 个盘子,每个盘子上写着一个仅由小写字母组成的英文单词. ...

  5. PHP+JQuery实现ajax跨域

    jQuery实现ajax跨域 1.dataType:'jsonp'2.type: 'get'3.把要传的参数以url方式传出去  url:'http://gameapi.feiliu.com/lqzg ...

  6. 【转】如何不让DataGridView自动生成列

    源地址:https://www.cnblogs.com/hailexuexi/p/3983856.html

  7. requests利用selenium,代理Ip,云打码,验证码抠图操作 爬取搜狗微信公众号内容

    爬取思路,爬取搜狗微信公众号内容,爬取第一层url时请求太快出现验证码,我这里用的蘑菇云代理,并在程序中我判断什么情况下是否+代理,做到合理运用代理ip.爬取第二层url时验证码出现次数更严重(和第一 ...

  8. Java的引用和C++的指针de区别

    Java的引用和C++的指针都是指向一块内存地址的,通过引用或指针来完成对内存数据的操作,就好像风筝的线轴一样,通过线轴总是能够找到风筝,但是它们在实现,原理作用等方面却有区别. (1)类型:引用其值 ...

  9. AR资料汇总学习

    ARKit 从入门到精通 http://www.chinaar.com/ARKit/5210.html ARKit 框架的学习 http://blog.csdn.net/biangabiang/art ...

  10. elasticsearch添加head插件

    首先,肯定是安装elasticsearch啦,我这里是直接在官网上下载rpm包安装的. 官网:https://www.elastic.co/downloads/elasticsearch elasti ...