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 相关文章推荐
javascript:以前写的xmlhttp池,代码
May 18 Javascript
js+数组实现网页上显示时间/星期几的实用方法
Jan 18 Javascript
JS定义回车事件(实现代码)
Jul 08 Javascript
Ajax中解析Json的两种方法对比分析
Jun 25 Javascript
学习使用bootstrap3栅格系统
Apr 12 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
Jun 23 Javascript
EasyUI 结合JS导出Excel文件的实现方法
Nov 10 Javascript
vue2.0使用swiper组件实现轮播效果
Nov 27 Javascript
快速解决bootstrap下拉菜单无法隐藏的问题
Aug 10 Javascript
JavaScript如何把两个数组对象合并过程解析
Oct 10 Javascript
vue实现鼠标经过动画
Oct 16 Javascript
HTML元素拖拽功能实现的完整实例
Dec 04 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
PHP生成Flash动画的实现代码
2010/03/12 PHP
php下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
php学习笔记之 函数声明
2011/06/09 PHP
PHP中常见的缓存技术实例分析
2015/09/23 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
2016/09/21 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
PHP自定义序列化接口Serializable用法分析
2017/12/29 PHP
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
2007/07/11 Javascript
JS图片预加载 JS实现图片预加载应用
2012/12/03 Javascript
如何使用jquery动态加载js,css文件实现代码
2013/04/03 Javascript
js 程序执行与顺序实现详解
2013/05/13 Javascript
浅析js预加载/延迟加载
2014/09/25 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
原生js和jquery实现图片轮播淡入淡出效果
2015/04/23 Javascript
javascript针对不确定函数的执行方法
2015/12/16 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
2020/08/21 Javascript
js原型链与继承解析(初体验)
2016/05/09 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
详解webpack+vue-cli项目打包技巧
2017/06/17 Javascript
详解tween.js 中文使用指南
2018/01/05 Javascript
React组件内事件传参实现tab切换的示例代码
2018/07/04 Javascript
在vue+element ui框架里实现lodash的debounce防抖
2019/11/13 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
[01:35]2018完美盛典章节片——共竞
2018/12/17 DOTA
Django在win10下的安装并创建工程
2017/11/20 Python
对IPython交互模式下的退出方法详解
2019/02/16 Python
利用pandas合并多个excel的方法示例
2019/10/10 Python
使用Python实现画一个中国地图
2019/11/23 Python
解决python 读取 log日志的编码问题
2019/12/24 Python
python使用gdal对shp读取,新建和更新的实例
2020/03/10 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
python的scipy.stats模块中正态分布常用函数总结
2021/02/19 Python
司考复习计划
2015/01/19 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书