vue3.2之边学边练(二)vue下axios封装

这一篇严格意义上说和vue没什么太大关系。

网页前端少不了请求数据,这也是为什么上一篇就加入了axios的需求添加。

原理就是通过axios发送相应的post,get网络请求请求数据,然后返回展现到页面上。

一、项目结构

在src目录下新建utils和api两个文件夹,utils用于存放的公共封装类库函数,api则是请求的方法

(utils 英文是工具类的意思)。utils文件夹下新建request.js文件,代码如下

request.js

import axios from 'axios'
//通过create方法创建请求。参数有baseURL和timeout

const service = axios.create({
    baseURL: import.meta.env.VITE_BASE_API,
    timeout: 5000
});
//创建请求拦截器
//请求拦截器里可以加入需要的token等认证信息,现在还用不到,所以基本是空的
service.interceptors.request.use(
    config => {
        return config;
    },
    error => {
        console.log(error);
        return Promise.reject(error);
    }

);
//创建相应拦截器
service.interceptors.response.use(
    response => {
        const res = response.data;
        return res;
    },
    error => {
        console.log(error);
        return Promise.reject(error);
    }
);

export default service;

这里有个import.meta.env.VITE_BASE_API,这个是在.env文件中定义的。vue在创建的过程中是没有.env这个文件的,需要自己手动加入。

VITE_BASE_API=http://localhost:8080/api/

 这个是定义的api基础地址。

关于vite的配置文件,vite官网Vite中文网 有详细的解释。

api文件夹下新建一个menu.js文件

menu.js

import request from '@/utils/request'

export function getMenu() {
    return request({
        url: 'menu/list',
        method: 'get'
    });
}

将刚刚封装的东东引入进来,然后去请求地址。这里只需要提供请求的url和请求方法就可以了。其实这里只是封装一个方法而已。这个方法返回的是一个Promise。这个api下面返回的数据如下。

这里返回的不是一个标准的带有状态的RESTful返回,只是一个json字符串,这里面还是有个坑的。

如果要调用的是完整的RESTful返回,那么引用的时候得加入data 属性的。

下一步就是业务页面使用了。

在Menu模板下调用

<script setup>
import { getMenu } from '@/api/menu'
import { ref, watchEffect } from 'Vue'
let menuList = ref();

watchEffect(async() => {   
    menuList.value =  await getMenu();    
});

</script>

<template>       
    <el-menu mode="horizontal">
        <el-menu-item v-for="menu in menuList" v-bind:key="menu.id" :index="menu.url">{{ menu.name }}</el-menu-item> 
    </el-menu>    
</template>

第一步引入封装的api

然后用vue的监听把数据返回来。这个ref引用得加value复制,否则数据时显示不出来的。

看看效果

 

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 是一个前端框架,而 axios 是一个基于 Promise 的 HTTP 请求库。在 Vue 项目中,我们通常需要使用 axios 来进行接口请求。由于每个项目的接口返回数据结构和请求方式可能不同,因此我们需要对 axios 进行封装以方便统一管理。 封装可以解决以下问题: 1. 统一处理请求错误,例如网络错误、接口返回的错误码等。 2. 统一处理请求 loading 状态,避免每个请求都需要手动设置 loading 状态。 3. 统一处理请求头和请求参数等信息,避免每个请求都需要手动设置。 以下是一个简单的 vue axios 封装的示例: ``` // api.js import axios from 'axios' import { Message } from 'element-ui' const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 5000 // 请求超时时间 }) // 请求拦截器 service.interceptors.request.use( config => { // 在这里可以统一设置请求头等信息 return config }, error => { // 请求错误时的处理 return Promise.reject(error) } ) // 响应拦截器 service.interceptors.response.use( response => { const res = response.data // 在这里可以统一处理接口返回的错误码等信息 if (res.code !== 0) { Message({ message: res.message || 'Error', type: 'error', duration: 5 * 1000 }) return Promise.reject(new Error(res.message || 'Error')) } else { return res } }, error => { // 响应错误时的处理 return Promise.reject(error) } ) export default service ``` 上述代码中,我们通过 axios.create 创建了一个 axios 实例,并对其进行了配置。在请求拦截器中,我们可以统一设置请求头等信息。在响应拦截器中,我们可以统一处理接口返回的错误码等信息,并使用 element-ui 中的 Message 组件来显示错误信息。 使用示例: ``` import request from '@/utils/api' request({ url: '/user/info', method: 'get', params: { id: 123 } }).then(response => { console.log(response) }).catch(error => { console.log(error) }) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值