Vue.js实战之使用Vuex + axios发送请求详解


Posted in Javascript onApril 04, 2017

前言

Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource

目前主流的 Vue 项目,都选择 axios 来完成 ajax 请求,而大型项目都会使用 Vuex 来管理数据,所以这篇博客将结合两者来发送请求

Vuex 的安装将不再赘述,可以参考之前的Vue.js实战之Vuex的入门教程

使用 cnpm 安装 axios

cnpm install axios -S

安装其他插件的时候,可以直接在 main.js 中引入并 Vue.use(),但是 axios 并不能 use,只能每个需要发送请求的组件中即时引入

为了解决这个问题,有两种开发思路,一是在引入 axios 之后,修改原型链,二是结合 Vuex,封装一个 aciton。具体的实施请往下看~

方案一:改写原型链

首先在 main.js 中引入 axios

import axios from 'axios'

这时候如果在其它的组件中,是无法使用 axios 命令的。但如果将 axios 改写为 Vue 的原型属性,就能解决这个问题

Vue.prototype.$ajax = axios

在 main.js 中添加了这两行代码之后,就能直接在组件的 methods 中使用 $ajax 命令

methods: {
 submitForm () {
 this.$ajax({
  method: 'post',
  url: '/user',
  data: {
  name: 'wise',
  info: 'wrong'
  }
 })
}

方案二:在 Vuex 中封装

之前的文章中用到过 Vuex 的 mutations,从结果上看,mutations 类似于事件,用于提交 Vuex 中的状态 state

action 和 mutations 也很类似,主要的区别在于,action 可以包含异步操作,而且可以通过 action 来提交 mutations

另外还有一个重要的区别:

mutations 有一个固有参数 state,接收的是 Vuex 中的 state 对象

action 也有一个固有参数 context,但是 context 是 state 的父级,包含  state、getters

Vuex 的仓库是 store.js,将 axios 引入,并在 action 添加新的方法

// store.js
import Vue from 'Vue'
import Vuex from 'vuex'

// 引入 axios
import axios from 'axios'

Vue.use(Vuex)

const store = new Vuex.Store({
 // 定义状态
 state: {
 test01: {
  name: 'Wise Wrong'
 },
 test02: {
  tell: '12312345678'
 }
 },
 actions: {
 // 封装一个 ajax 方法
 saveForm (context) {
  axios({
  method: 'post',
  url: '/user',
  data: context.state.test02
  })
 }
 }
})

export default store

注意:即使已经在 main.js 中引入了 axios,并改写了原型链,也无法在 store.js 中直接使用 $ajax 命令

换言之,这两种方案是相互独立的

在组件中发送请求的时候,需要使用 this.$store.dispatch 来分发

methods: {
 submitForm () {
 this.$store.dispatch('saveForm')
 }
}

submitForm 是绑定在组件上的一个方法,将触发 saveForm,从而通过 axios 向服务器发送请求

附:配置 axios

上面封装的方法中,使用了 axios 的三个配置项,实际上只有 url 是必须的。

为了方便,axios 还为每种方法起了别名,比如上面的 saveForm 方法等价于:

axios.post('/user', context.state.test02)

完整的请求还应当包括 .then 和 .catch

.then(function(res){
 console.log(res)
})
.catch(function(err){
 console.log(err)
})

当请求成功时,会执行 .then,否则执行 .catch

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
window.print打印指定div实例代码
Dec 13 Javascript
Javascript 按位与赋值运算符 (&=)使用介绍
Feb 04 Javascript
javascript二维数组转置实例
Jan 22 Javascript
js中window.open的参数及注意注意事项
Jul 06 Javascript
老生常谈js动态添加事件--- 事件委托
Jul 19 Javascript
Google Maps基础及实例解析
Aug 06 Javascript
jQuery向父辈遍历的简单方法
Sep 18 Javascript
纯js实现悬浮按钮组件
Dec 17 Javascript
jQuery Password Validation密码验证
Dec 30 Javascript
基于jquery二维码生成插件qrcode
Jan 07 Javascript
纯js代码生成可搜索选择下拉列表的实例
Jan 11 Javascript
js实现盒子拖拽动画效果
Aug 09 Javascript
Vue.js实战之组件的进阶
Apr 04 #Javascript
关于axios返回空对象的问题解决
Apr 04 #Javascript
jQuery自定义图片上传插件实例代码
Apr 04 #jQuery
jQuery使用unlock.js插件实现滑动解锁
Apr 04 #jQuery
利用jquery正则表达式在页面验证url网址输入是否正确
Apr 04 #jQuery
JavaScript实现实时更新系统时间的实例代码
Apr 04 #Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
Apr 04 #jQuery
You might like
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
利用jQuery接受和处理xml数据的代码(.net)
2011/03/28 Javascript
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
2011/06/20 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
2013/07/28 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
js实现新浪微博首页效果
2015/10/16 Javascript
浅析Bootstrap缩略图组件与警示框组件
2016/04/29 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
JavaScript数组迭代方法
2017/03/03 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
node.js中http模块和url模块的简单介绍
2017/10/06 Javascript
Vue SSR 组件加载问题
2018/05/02 Javascript
基于Vue插入视频的2种方法小结
2019/04/02 Javascript
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
2020/12/29 Javascript
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
解决python写的windows服务不能启动的问题
2014/04/15 Python
python编写的最短路径算法
2015/03/25 Python
python中字符串类型json操作的注意事项
2017/05/02 Python
Python绘制3D图形
2018/05/03 Python
儿童python练习实例
2018/05/27 Python
python 实现在shell窗口中编写print不向屏幕输出
2020/02/19 Python
利用Python实现Excel的文件间的数据匹配功能
2020/06/16 Python
html5与css3小应用
2013/04/03 HTML / CSS
前后端结合实现amazeUI分页效果
2020/08/21 HTML / CSS
大学生先进事迹材料
2014/02/16 职场文书
跟单业务员岗位职责
2014/03/08 职场文书
商铺消防安全责任书
2014/07/29 职场文书
入党积极分子学习党的纲领思想汇报
2014/09/13 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
2016重阳节红领巾广播稿
2015/12/18 职场文书
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL
python中使用 unittest.TestCase单元测试的用例详解
2021/08/30 Python