第一种:使用nuxt 提供的 Axios插件 @nuxtjs/axios

1、安装:npm install @nuxtjs/axios -d

2、配置 nuxt.config.js

  1. exports default {
  2. modules: [
  3. '@nuxtjs/axios',
  4. ]
  5. }

3、在提供的context(上下文对象)中取得$axios

  1. async asyncData({ $axios }) {
  2. const ip = await $axios.$get('...')
  3. return { ip }
  4. }

4、使用Nuxt plugin扩展Axios

  nuxt会在vue.js程序启动前调用 plugins目录下的脚本,并且以context(上下文对象)作为参数,可以取到$axios

  创建 plugins/axios.js 并定义axios的拦截器,定义请求的各个阶段需要进行的处理

  1. export default function({ $axios, redirect }) {
  2. // request interceptor
  3. $axios.interceptors.request.use(
  4. config => {
  5. // do something before request is sent
  6. return config
  7. },
  8. error => {
  9. // do something with request error
  10. return Promise.reject(error)
  11. }
  12. )
  13. $axios.onRequest(config => {
  14. console.log('Making request to ' + config.url)
  15. })
  16.  
  17. // response interceptor
  18. $axios.interceptors.response.use(
  19. /**
  20. * Determine the request status by custom code
  21. * Here is just an example
  22. * You can also judge the status by HTTP Status Code
  23. */
  24. response => {
  25. const res = response.data
  26. if (res.code === ) {
  27. return res
  28. } else {
  29. redirect('/404')
  30. // if the custom code is not 200, it is judged as an error.
  31. }
  32. return Promise.reject(new Error(res.msg || 'Error'))
  33. },
  34. error => {
  35. console.log('err' + error) // for debug
  36.  
  37. return Promise.reject(error)
  38. }
  39. )
  40.  
  41. $axios.onError(error => {
  42. const code = parseInt(error.response && error.response.status)
  43. if (code === ) {
  44. redirect('/404')
  45. } else if (code === ) {
  46. redirect('/500')
  47. }
  48. })
  49. }

5、添加插件到nuxt.config.js配置文件

  1. plugins: [
  2. '@/plugins/axios'
  3. ],

第二种:直接引入axios,并模块化请求,就像vue中那样使用

1、安装:npm install axios --save

2、创建Axios扩展request.js

  在/api/request.js主要做了3件事:

  • 创建axios实例
  • 增加request拦截器,在请求发出前做自定义处理,比如加上token,sessionID
  • 增加response拦截器,收到响应信息后判断响应状态,如果出错可以使用Message组件提示

  PS:在AsyncData方法中调用时,在服务器端执行,没有UI,所以无法进行UI展示提示。所以需要通过process.server变量判断当前环境是不是服务器。

  1. /**
  2. * 封装Axios
  3. * 处理请求、响应错误信息
  4. */
  5. import { Message } from 'element-ui' //引用饿了么UI消息组件
  6. import axios from 'axios' //引用axios
  7.  
  8. // create an axios instance
  9. const service = axios.create({
  10. baseURL: '/api/', // 所有异步请求都加上/api,nginx转发到后端Springboot
  11. withCredentials: true, // send cookies when cross-domain requests
  12. timeout: // request timeout
  13. })
  14.  
  15. // request interceptor
  16. service.interceptors.request.use(
  17. config => {
  18. // do something before request is sent
  19. // config.headers['-Token'] = getToken()
  20. return config
  21. },
  22. error => {
  23. // do something with request error
  24. console.log(error) // for debug
  25. return Promise.reject(error)
  26. }
  27. )
  28.  
  29. // response interceptor
  30. service.interceptors.response.use(
  31. /**
  32. * If you want to get http information such as headers or status
  33. * Please return response => response
  34. */
  35.  
  36. /**
  37. * Determine the request status by custom code
  38. * Here is just an example
  39. * You can also judge the status by HTTP Status Code
  40. */
  41. response => {
  42. const res = response.data //res is my own data
  43.  
  44. if (res.code === ) {
  45. // do somethings when response success
  46. // Message({
  47. // message: res.message || '操作成功',
  48. // type: 'success',
  49. // duration: 1 * 1000
  50. // })
  51. return res
  52. } else {
  53. // if the custom code is not 200000, it is judged as an error.
  54. Message({
  55. message: res.msg || 'Error',
  56. type: 'error',
  57. duration: *
  58. })
  59. return Promise.reject(new Error(res.msg || 'Error'))
  60. }
  61. },
  62. error => {
  63. console.log('err' + error) // for debug
  64. Message({
  65. message: error.message,
  66. type: 'error',
  67. duration: *
  68. })
  69. return Promise.reject(error)
  70. }
  71. )
  72.  
  73. export default service //导出封装后的axios

3、创建API接口文件

  创建API接口文件,抽出所有模块的异步请求,将同模块的请求写在一起,将ajax请求和页面隔离,如果后端API调整,只需要修改对应接口文件

  1. import request from './request'
  2.  
  3. /**
  4. * 获取博客详情
  5. * @param id 博客ID
  6. */
  7. export function getBlog(id) {
  8. return request({
  9. url: 'blog/detail/' + id,
  10. method: 'get'
  11. })
  12. }
  13. /**
  14. * 获取博客列表
  15. * @param page 页码
  16. * @param max 每页显示数量
  17. */
  18. export function getList(page, max) {
  19. return request({
  20. url: 'blog/list',
  21. method: 'get',
  22. params: { page, max }
  23. })
  24. }

4、vue组件使用

  1. import { getBlog} from '~/api/blog'
  2.  
  3. asyncData({ params, redirect}) {
  4. return getBlog(params.id) //直接使用API导出的方法进行请求
  5. .then(({ data }) => {
  6. return { blog: data }
  7. }).catch((e) => { //从nuxt context 中获取 redirect 进行跳转
  8. redirect('/404')
  9. })
  10. }

NuxtJS如何利用axios异步请求的更多相关文章

  1. vue 中使用 async/await 将 axios 异步请求同步化处理

    1. axios 常规用法: export default { name: 'Historys', data() { return { totalData: 0, tableData: [] } }, ...

  2. js循环调用axios异步请求,实现同步

    准备: const axios = require('axios'); // axios请求 const res = []; const arr = ["a", "b&q ...

  3. vue axios异步请求django

    1,配置请求路径 (1),vue中的请求路径要与django视图路径相同. (2),vue中的路由路径也要和django视图路径相同,比如视图路径为127.0.0.1:8000:home/index, ...

  4. 4.npm模块安装和使用(axios异步请求,lodash工具库)

    建立package.json npm init 下载包 npm install axios npm install lodash 下载包,并加到package里面 npm install axios ...

  5. swiper用axios异步请求后 循环失效

    解决方案 使用ajax动态获取数据  当数据还没有收到的时候,swiper组件收到的是跟组件data传过来的空数组,会造成渲染问题 这个时候可以给swiper组件 设置一个  v-if='list.l ...

  6. vue--axios异步请求及文件目录结构分析(个人记录)

    我这里使用axios进行异步加载 axios是一个库,并不是vue中的第三方插件,使用时不能通过Vue.use()安装插件,需要在原型上进行绑定,即直接在main.js中使用Vue.prototype ...

  7. maven工程 java 实现文件上传 SSM ajax异步请求上传

    java ssm框架实现文件上传 实现:单文件上传.多文件上传(单选和多选),并且用 ajax 异步刷新,在当前界面显示上传的文件 首先springmvc的配置文件要配置上传文件解析器: <!- ...

  8. 解决ajax异步请求数据后swiper不能循环轮播(loop失效)问题、滑动后不能轮播的问题。

    问题描述: 1.我使用axios异步请求后台的图片进行渲染后不能实现循环轮播,也就是loop失效,但是静态写死的情况下不会出现这种问题. 2. 分析: swiper的机制是:初始化的时候将swiper ...

  9. Vue axios异步获取后台数据alert提示undefined

    记录一个小问题,关于分页查询套餐 前台通过axios异步请求获取后台数据alert弹出数据提示undefined 下面有三个bean PageResult /** * 分页结果封装对象 */ publ ...

随机推荐

  1. 所有子模块都要执行的checkstyle检查

    <!-- 所有子模块都要执行的checkstyle检查 --> <plugin> <groupId>org.apache.maven.plugins</gro ...

  2. 如何使用Git 优雅的版本回退呢?

    在版本迭代开发过程中,相信很多人都会有过错误提交的时候(至少良许有过几次这样的体验).这种情况下,菜鸟程序员可能就会虎驱一震,紧张得不知所措.而资深程序员就会微微一笑,摸一摸锃亮的脑门,然后默默的进行 ...

  3. json_rpc_2 implementation

    https://stackoverflow.com/questions/52670255/flutter-json-rpc-2-implementation import 'dart:convert' ...

  4. 处理vue-quill-editor回显数据的时候没有空格问题

    这是我要实现的效果 这是我回显后的情况(可以看见空格都没有了) 处理后 处理方法  添加一个class="ql-editor" <quill-editor class=&qu ...

  5. js跳出循环的方法区别(break,continue,return)(转载)

    转自:http://blog.csdn.net/fxss5201/article/details/52980138 js编程语法之break语句: break语句会使运行的程序立刻退出包含在最内层的循 ...

  6. secureCRT 中各种传输协议分析 启动daemon运行守护进程(转)

    转载链接:http://blog.sina.com.cn/s/blog_61798d5d01018yk4.html [Telnet]著名的终端访问协议,传统的网络服务程序,如FTP.POP和Telne ...

  7. 【Docker】docker的安装和常用命令

    一.docker安装和启动 1.yum 命令 yum install docker 2.docker启动命令 sudo systemctl start docker 二.docker常用命令 dock ...

  8. web之表单form

    表单是我们平常编写Web应用常用的工具,表单(<form>)用来收集用户提交的数据,发送到服务器.比如,用户提交用户名和密码,让服务器验证,就要通过表单.表单是一个包含表单元素或控件的区域 ...

  9. Apache:编译和安装

    1.在Fedora / CentOS / Red Hat Enterprise Linux上安装 sudo yum install httpd sudo systemctl enable httpd ...

  10. beta版本——第一次冲刺

    第一次冲刺 (1)SCRUM部分☁️ ✨成员描述: 姓名 李星晨 完成了哪个任务 增加了个人中心返回主页按钮 花了多少时间 1h 还剩余多少时间 1h 遇到什么困难 没有遇到问题 这两天解决的进度 1 ...