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 ...
随机推荐
- 【Jmeter】如何通过文件导入方式对用户名和密码进行参数化设置
JMeter 参数化 注意:param和data body只能用一个.所有任何一个里面有内容,切换都会报错,这不是问题,jmeter是这么设计的 方法一:通过添加CSV Data Set Config ...
- 编码问题:python写入文件
方法一:(推荐) line1 = "我爱中国111" line2 = u"我爱祖国222" with open('1.txt','w',encoding='ut ...
- 去掉UITableView多余的分割线
UIView *v = [[UIView alloc] initWithFrame:CGRectZero]; [_tableView setTableFooterView:v];
- Python高阶函数(Map、Reduce、Filter)
Map函数 map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回. 举例说明 比如我们有一个函数f(x)=x2,要把这个函数作用 ...
- tomcat访问
1:html页面或者需要访问的对象需要放置到webapps/ROOT下面既可以 http://localhost:8080/直接访问 2:
- ConcurrentModificationException
//需求:如何集合中有给定的元素就在集合中在插入一个元素public class ListIteratorDemo2 { public static void main(String[] args) ...
- jquery closest & parent比较
.closest() .parents() 从当前元素开始 从父元素开始 沿 DOM 树向上遍历,直到找到已应用选择器的一个匹配为止. 沿 DOM 树向上遍历,直到文档的根元素为止,将每个祖先元素添加 ...
- 随机模拟MCMC和Gibbs Sampling
随机模拟 统计模拟中有一个重要的问题就是给定一个概率分布 p(x),我们如何在计算机中生成它的样本.一般而言均匀分布 Uniform(0,1)的样本是相对容易生成的. 通过线性同余发生器可以生成伪随机 ...
- python中的re模块中的向后引用和零宽断言
1.后向引用 pattern = re.compile(r"(\w+)")#['hello', 'go', 'go', 'hello'] # pattern = re.compil ...
- ASIC中的一些库和文件类型
以下内容均来源于网络: 在进行综合,分析STA时,有几种库类型. NLDM: 非线性线载模型,最基本的dot lib. 电压源模型,cap值是单一值. 在90nm工艺以下,由于晶体管的特性变得很复杂 ...