本文是受多篇类似博文的影响写成的,内容也大致相同。无意抄袭,只是为了总结出一份自己的经验。   

  一直以来,在使用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发送请求的更多相关文章

  1. Vue 爬坑之路(六)—— 使用 Vuex + axios 发送请求

    Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource 目前主流的 Vue 项目,都选择 axios ...

  2. Vue 爬坑之路—— 使用 Vuex + axios 发送请求

    Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource 目前主流的 Vue 项目,都选择 axios  ...

  3. vue项目中使用mockjs+axios模拟后台数据返回

    自己写练手项目的时候常常会遇到一个问题,没有后台接口,获取数据总是很麻烦,于是在网上找了下,发现一个挺好用的模拟后台接口数据的工具:mockjs.现在把自己在项目中使用的方法贴出来   先看下项目的目 ...

  4. vue项目中的跨域源请求拦截问题CORS头缺少'Access-Control-Allow-Origin'

    这里使用的是axios发请求出现的. 访问的api接口是: 在不同域之间访问是比较常见,在本地调试访问远程服务器....这就是有域问题. VUE解决通过proxyTable 解决办法: 1.检查请求方 ...

  5. vue项目中使用vuex

    1.运行 cnpm i vuex -S 2.导入包 import Vuex from 'vuex' 3.注册vuex到vue中 Vue.use(vuex) 4. var store = new Vue ...

  6. 在vue项目中的axios使用配置记录

    默认vue项目中已经安装axios,基于element-ui开发,主要记录配置的相关. axiosConfig.js import Vue from 'vue' import axios from ' ...

  7. 在vue项目中使用axios发送FormData

    这个是axios的中文文档,挺详细的: https://www.kancloud.cn/luponu/axios/873153 文档中的    使用 application/x-www-form-ur ...

  8. vue项目使用axios发送请求让ajax请求头部携带cookie

    最近做vue项目时遇到登录权限问题,登录以后再发送的请求头部并没有携带登录后设置的cookie,导致后台无法校验其是否登录.检查发现是vue项目中使用axios发送ajax请求导致的.查看文档得知ax ...

  9. vue-cli3.x中使用axios发送请求,配合webpack中的devServer编写本地mock数据接口(get/post/put/delete)

    vue-cli3.x中使用axios发送请求,配合webpack中的devServer编写本地mock数据接口(get/post/put/delete) 手把手式笔记 Axios配置 安装 axios ...

随机推荐

  1. LeetCode-206.ReverseLinked List

    Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5->4-> ...

  2. office 2016 install(office2016组件自定义安装激活程序) v5.9.3中文绿色版

    下载地址  http://www.ddooo.com/softdown/71741.htm#dltab office 2016 install是目前下载office2016和office2016组件最 ...

  3. [py]flask实现用户cmdb

    人最难做到的就是跟自己学习, 总是学习别人的, 沉淀, 过一段时间忘了刚学到的, 在向别人学习, 而非看看自己的沉淀, 殊不知, 世界上最亲近,最默契的人是自己. 用户cmdb功能概述 之前学flas ...

  4. http形式的webservice

    import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import ...

  5. 项目发布脚本-go

    #!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin clear printf &q ...

  6. GET 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.2/gradle-3

    Could not GET 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.2/gradle-3 ...

  7. 从游戏开发到web前端——仅仅只是开始

    文章开头,请允许我随便扯扯. 一来,开头从来都是最难写的,二来,描述我现在的心情和状态以及工作背景啥的,对于大家理解后面的内容也许会有所帮助~ 2012年211大学毕业,工作4年了,一直都是做游戏前端 ...

  8. 更换mysql数据库的datadir目录

    更换过程如下: 1.新建指定的datadir目录,这里举例如:E:/mysql_datadir/data. 2.关闭mysql57服务器. 3.将原来的datadir目录下面的所有文件拷贝到E:/my ...

  9. MSF渗透测试-CVE-2017-11882(MSOffice漏洞)

    1.测试环境 2.测试前准备 3.测试过程 -3.1虚拟机环境测试 -3.2局域网靶机测试 4.测试感想 1.测试环境 攻击机: OS:kail IP:192.168.15.132/192.168.1 ...

  10. mysql函数之四:concat() mysql 多个字段拼接

    语法: COUNT(DISTINCT expr ,[expr ...]) 函数使用说明:返回不同的非NULL 值数目.若找不到匹配的项,则COUNT(DISTINCT) 返回 0 Mysql的查询结果 ...