Vue处理ajax请求

Ajax请求

1>解决跨域问题

1.1前端解决。只需要在vue.config.js中增加devServer节点增加代理:

const path = require("path");
const resolve = dir => path.join(__dirname, dir);
const BASE_URL = process.env.NODE_ENV === ‘procution‘ ? ‘/iview-admin/‘ : ‘/‘
module.exports = {
  lintOnSave: false,
  baseUrl: BASE_URL,
  chainWebpack: config => {
    config.resolve.alias.set("@",resolve(‘src‘)).set("_c",resolve(‘src/components‘))
  },
  //打包时不生成.map文件
  productionSourceMap: false,
  //跨域配置
 devServer: {
    proxy:"http://localhost:4000"
 }
}

1.2后端解决,应用cors(Cross-Origin Resource Sharing)解决。

如果是node环境,可以这样写:

app.all("*",(req,res,next)=>{
    res.hearder("Access-Control-Allow-Origin","*");
    res.hearder("Access-Control-Allow-Headers","X-Requested-With,Content-Type");
    res.hearder("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
});

如果是.net环境,在Global.asax中添加如下代码片段:

protected void Application_BeginRequest(object sender, EventArgs e)
{
  HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
  if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
  {
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE");
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
    HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
    HttpContext.Current.Response.End();
  }
}

2>封装axios

下面用axios模拟一个ajax请求为例来对其进行封装:

代码目录结构:

config/index.js:

export const baseURL =
  process.env.NODE_ENV == "production"
    ? "http://production.com"
    : "http://localhost:3000";

lib/axios.js:

import axios from "axios";
import { baseURL } from "@/config";
//ES6类的写法
class HttpRequest {
  //ES6默认参数
  constructor(baseUrl = baseURL) {
    this.baseUrl = baseUrl;
    this.queue = {}; //将请求都放到队列中
  }
  getInsideConfig() {
    const config = {
      baseURL: this.baseUrl,
      hearders: {
        //
      }
    };
    return config;
  }
  //封装拦截器
  interceptors(instance, url) {
    instance.interceptors.request.use(
      config => {
        //添加全局的loading
        //Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组
        if (!Object.keys(this.queue).length) {
          //spin.show
        }
        this.queue[url] = true;
        return config;
      },
      error => {
        return Promise.reject(error);
      }
    );
    instance.interceptors.response.use(
      res => {
        delete this.queue[url];
        const { data, status } = res;
        return { data, status };
      },
      error => {
        delete this.queue[url];
        return Promise.reject(error);
      }
    );
  }

  request(options) {
    debugger
    const instance = axios.create();
    /**
     * Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
     * const target = { a: 1, b: 2 };
     * const source = { b: 4, c: 5 };
     * const returnedTarget = Object.assign(target, source);
     * console.log(target);
     * expected output: Object { a: 1, b: 4, c: 5 }
     */
    options = Object.assign(this.getInsideConfig(), options);
    this.interceptors(instance, options.url);
    return instance(options);
  }
}

export default HttpRequest;

api/index.js

import HttpRequest from ‘@/lib/axios‘
const axios = new HttpRequest()
export default axios

api/user.js

import axios from "./index";

export const getUserInfo = ({ userId }) => {
  debugger
  return axios.request({
    url: "/getUserInfo",
    method: "post",
    data: {
      userId
    }
  });
};

home.vue:

  <template>
  <div class="home">
    <b>{{ food }}</b>
    <button @click="getInfo">请求数据</button>
  </div>
</template>

  <script>
// @ is an alias to /src
import HelloWorld from "@/components/HelloWorld.vue";
import { getUserInfo } from ‘@/api/user‘
export default {
  name: "home",
  components: {
    HelloWorld
  },
  props: {
    food: {
      type: String,
      default: "apple"
    }
  },
  beforeRouteEnter(to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当守卫执行前,组件实例还没被创建
    next(vm => {
      //若想使用实例,可使用这种方法
      console.log(vm);
    });
  },
  beforeRouteLeave(to, from, next) {
    // const leave = confirm(‘您确定要离开吗?‘)
    // if (leave) next()
    // else next(false)
    next();
  },
  methods: {
    getInfo() {
      getUserInfo({ userId: 21 }).then(res => {
        console.log("res: ", res);
      });
   }
  }
};
</script>

原文地址:https://www.cnblogs.com/qicao/p/10803618.html

时间: 2024-09-30 00:17:00

Vue处理ajax请求的相关文章

从零开始学 Web 之 Vue.js(四)Vue的Ajax请求和跨域

大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:http://www.cnblogs.com/lvonve/ CSDN:https://blog.csdn.net/lvonve/ 在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享一些好玩的项目.现在就让我们一起进入 Web 前端学习的冒险之旅吧! 一.Vue发送Aj

vue中ajax请求发送

示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> spa

vue发送ajax请求

一.vue-resource 1.简介 一款vue插件,用于处理ajax请求,vue1.x时广泛应用,现不被维护. 2.使用流程 step1:安装 [命令行输入] npm install vue-resource --save step2:引入 [main.js] // 引入vue-resource import VueResource from 'vue-resource' // 使用vue-resource Vue.use(VueResource) step3:编码 [格式:] this.$

vue 中 ajax请求封装以及使用方法

async/await 1)async/await场景 这是一个用同步的思维来解决异步问题的方案,当前端接口调用需要等到接口返回值以后渲染页面时. 2)名词解释 >async  async的用法,它作为一个关键字放到函数前面,用于表示函数是一个异步函数,因为async就是异步的意思, 异步函数也就意味着该函数的执行不会阻塞后面代码的执行,             async 函数返回的是一个promise 对象. >await await的含义为等待.意思就是代码需要等待await后面的函数运

vue的ajax请求之axios

axios.get(this.apiUrl+'good/info',{params:{'goodsid':'sp441153'}}) .then(function(response){ console.log(response); _this.pics=response.data.data.pics; _this.message=response.data.data; _this.goodsAttr=response.data.data.goods_attr; _this.colorList=r

vue实现ajax滚动下拉加载,同时具有loading效果

<!doctype html> <html> <head> <meta charset="utf-8"> <title>vue测试ajax的使用</title> <meta id="viewport" name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.

初识vue 2.0(3):Ajax请求

0,模拟ajax请求,需要构建web程序,使用express 方便快捷. 1,安装express 构建web server: npm install -g express npm install -g express-generator 2,创建 express 项目: express myserver cd myserver npm install 3,启动项目,一般情况下可以使用: npm start 但开发环境需要监控代码变动并自动重启进程,因此需要安装 supervisor. npm i

Vue框架axios请求(类似于ajax请求)

Vue框架axios get请求(类似于ajax请求) 首先介绍下,这个axios请求最明显的地方,通过这个请求进行提交的时候页面不会刷新 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="vue.js"></scr

vue实战使用ajax请求后台数据(小白)

vue实战使用ajax请求后台数据(小白) 前言:前端小白入门到这个阶段,应该会知道我们所做的页面上那些数据,绝大部分都不是静态的数据,而是通过调用后台接口把数据渲染到页面上的效果.ajax可以帮助我们更好的去实现这一点,下面是详解在vue中如何使用它. vue本身它是不支持直接发送ajax请求的,需要用到axios(一个基于promise的HTTP库,可以用在浏览器和node.js中)这是Axios文档的介绍,详细可查看:https://www.kancloud.cn/yunye/axios/