Vue项目中使用Vuex + axios发送请求
本文是受多篇类似博文的影响写成的,内容也大致相同。无意抄袭,只是为了总结出一份自己的经验。
一直以来,在使用Vue进行开发时,每当涉及到前后端交互都是在每个函数中单独的写代码,这样一来加大了工作量,二来代码零散复用度不高,修改时要多处修改,漏一处就出问题,三来满足于一种简单的方式不利于深入研究技术。现在做项目需要修改使用Vuex+axios发送请求的代码时,也是把原来的代码改为自己的“保留技术”,这样很不好,所以得研究一下如何在Vue项目中更好的与后台交互。
1、修改原型链的方案
// main.js
import axios from 'axios'; // 引入axios Vue.prototype.$ajax = axios; // 修改原型链 // componnentName.vue
methods: {
getData () {
this.$ajax.get('/user-list').then( res => {
console.log(res)
}).catch(err => {
console.log(err)
})
}
}
2、Vuex结合axios封装一个action的方案
// main.js
import store from './store/'; // 方案二:结合Vuex封装一个action new Vue({
el: '#app',
router,
store, // 方案二:结合Vuex封装一个action
components: { App },
template: '<App/>'
}) // store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import axios from "axios"; Vue.use(Vuex); const store = new Vuex.Store({
state: { // 初始化数据,只要有可能的用到的最好都初始化
text: {name: 'xxx'},
data: {}
},
mutations: {
changeData (state, obj) { // store中的数据只能通过commit mutation来改变
state.data = obj
}
},
actions: {
// 封装一个ajax方法
saveForm (context) {
axios.get('./b2b/captcha/img-captcha'}, context.state.test).then(res => { // 调用接口
context.commit('changeData', res.data) // 通过接口获取的后台数据保存到store中,等待组件取用
})
}
}
}) export default store; // componentName.vue
computed: {
data () { // 获取store里的数据,放在computed中可以实时更新
return this.$store.state.data;
}
},
methods: {
getDataVuex () {
this.$store.dispatch('saveForm'); // 触发actions里的saveForm函数,调动接口
},
}
上述两种方案是相互独立的,也就是说,即使在main.js中引入了axios并修改了原型链,在store/index.js中也不能直接使用this.$ajax,而是要引入axios后再使用。
3、回调函数中的this指向问题
回调函数如果是箭头函数,那么箭头函数内部的this会自动获取所在上下文的this值,作为自己的this值。在Vue项目中,this会指向当前的组件实例。
data () {
return {
a: 123
}
},
methods: {
getDataVuex () {
this.$store.dispatch('saveForm').then(res => { // 回调函数是箭头函数
console.log(this.a); // --> 123
})
},
}
如果回调函数是普通函数,那么普通函数中this指向的不是组件实例,所以得进行一些处理才能让this指向当前的组件实例。
data () {
return {
a: 123
}
},
methods: {
getDataVuex () {
this.$store.dispatch('saveForm').then(function(res) { // 回调函数是普通函数
console.log(this.a); // --> Cannot read property 'msg' of undefined
})
},
}
// 解决方案如下:
getDataVuex () {
var _vm = this;
_vm.$store.dispatch('saveForm').then(function(res) { // 回调函数是普通函数
console.log(_vm.a); // --> 123
})
}
// 或:
getDataVuex () {
this.$store.dispatch('saveForm').then(function(res) { // 回调函数是普通函数
console.log(this.a); // --> 123
}.bind(this))
}
Vue项目中使用Vuex + axios发送请求的更多相关文章
- Vue 爬坑之路(六)—— 使用 Vuex + axios 发送请求
Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource 目前主流的 Vue 项目,都选择 axios ...
- Vue 爬坑之路—— 使用 Vuex + axios 发送请求
Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource 目前主流的 Vue 项目,都选择 axios ...
- vue项目中使用mockjs+axios模拟后台数据返回
自己写练手项目的时候常常会遇到一个问题,没有后台接口,获取数据总是很麻烦,于是在网上找了下,发现一个挺好用的模拟后台接口数据的工具:mockjs.现在把自己在项目中使用的方法贴出来 先看下项目的目 ...
- vue项目中的跨域源请求拦截问题CORS头缺少'Access-Control-Allow-Origin'
这里使用的是axios发请求出现的. 访问的api接口是: 在不同域之间访问是比较常见,在本地调试访问远程服务器....这就是有域问题. VUE解决通过proxyTable 解决办法: 1.检查请求方 ...
- vue项目中使用vuex
1.运行 cnpm i vuex -S 2.导入包 import Vuex from 'vuex' 3.注册vuex到vue中 Vue.use(vuex) 4. var store = new Vue ...
- 在vue项目中的axios使用配置记录
默认vue项目中已经安装axios,基于element-ui开发,主要记录配置的相关. axiosConfig.js import Vue from 'vue' import axios from ' ...
- 在vue项目中使用axios发送FormData
这个是axios的中文文档,挺详细的: https://www.kancloud.cn/luponu/axios/873153 文档中的 使用 application/x-www-form-ur ...
- vue项目使用axios发送请求让ajax请求头部携带cookie
最近做vue项目时遇到登录权限问题,登录以后再发送的请求头部并没有携带登录后设置的cookie,导致后台无法校验其是否登录.检查发现是vue项目中使用axios发送ajax请求导致的.查看文档得知ax ...
- vue-cli3.x中使用axios发送请求,配合webpack中的devServer编写本地mock数据接口(get/post/put/delete)
vue-cli3.x中使用axios发送请求,配合webpack中的devServer编写本地mock数据接口(get/post/put/delete) 手把手式笔记 Axios配置 安装 axios ...
随机推荐
- 【CSS3】CSS3自学
CSS3学习网址:http://www.runoob.com/css3/css3-tutorial.html
- 控制div显示隐藏(有文字图片介绍)
<div class="toggle"> <p id="zi">收起</p> <p id="zhe" ...
- POJ3096:Surprising Strings(map)
http://poj.org/problem?id=3096 for循环真是奇妙! #include <string.h> #include <stdio.h> #includ ...
- VS2010/MFC编程入门之四十三(MFC常用类:CTime类和CTimeSpan类)
上一节中鸡啄米讲了MFC常用类CString类的用法,本节继续讲另外两个MFC常用类-日期和时间类CTime类和CTimeSpan类. 日期和时间类简介 CTime类的对象表示的时间是基于格林威治标准 ...
- VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下)
上一节中鸡啄米讲了标签控件知识的上半部分,本节继续讲下半部分. 标签控件的创建 MFC为标签控件的操作提供了CTabCtrl类. 与之前的控件类似,创建标签控件可以在对话框模板中直接拖入Tab Con ...
- EOJ Monthly 2018.11 猜价格 (模拟)
分三种情况: 1.k=1.此时每次都说反话,反着二分即可. 2.1<k <= n.那么在前n次问答中一定会出现一次错误,通过不断输出1找出那个错误发生的位置(若回答是>那这就是错误) ...
- CATiledLayer
CATiledLayer 有些时候你可能需要绘制一个很大的图片,常见的例子就是一个高像素的照片或者是地球表面的详细地图.iOS应用通畅运行在内存受限的设备上,所以读取整个图片到内存中是不明智的.载入大 ...
- 错误源:.net SqlClient data provider
下午在做毕业设计的时候,想删除数据库的一条数据,结果发现删除的时候老是出现 ======错误源:.net SqlClient data provider==== 这样的错误:本来以为是我还在运行着项目 ...
- 【转】Redis之发布 订阅模式
本例包括 jedis_demo:入口类 jedis_control:jedis控制器(jedis的连接池) jedis_pub_sub_listener:订阅的监听器 singleton_agent: ...
- Q-learning简明实例Java代码实现
在<Q-learning简明实例>中我们介绍了Q-learning算法的简单例子,从中我们可以总结出Q-learning算法的基本思想 本次选择的经验得分 = 本次选择的反馈得分 + 本次 ...