Vue2 跨域 axios二次封装 localstorage封装

文章详细介绍了在Vue2项目中处理跨域问题的方法,包括设置.env文件以区分不同环境,修改vue.config.js配置代理,以及axios的二次封装,添加请求和响应拦截器。同时,还展示了如何封装localstorage以便在全局使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vue2 跨域

在src同级创建 :

.env.production 内容为:

# just a flag
ENV = 'production'

# base api
VUE_APP_BASE_API = 'http://127.0.0.1:8080'

.env.development  内容为:

# 开发环境配置
ENV = 'development'
 
#设置端口号
port=8080
 
# 前端请求路径
VUE_APP_BASE_API = '/api'
 
# #后端服务器地址不要忘记添加http或https
# BASE_URL_REAR='http://127.0.0.1:8080/'

.env.test 内容为:

ENV = 'test'
NODE_ENV='test'

vue.config.js  内容为:

module.exports = {
    devServer: {
        // 默认值 为localhost 127.0.0.1
        // 端口默认为8080
        // host: "localhost",
        // port: "8080",
        // 默认有的
        proxy: {
            "/api": { // 配置你要让那些路径要跨域
                // 你可以让该路径前面添加api
                // login
                // 是后台路径
                target: "后台服务器地址", // 38

                // true 代表跨域
                changOrigin: true,
                pathRewrite: { //忽略api ,将api变成空格
                    "^/api": ""
                }
            }
        }
    }
}

axios二次封装

在src目录下创建 utils 目录  在里面创建 request.js 文件 内容为:

import axios from "axios";
import qs from 'qs'
import storage from "@/utils/storage"//后期引入localstorage的封装使用

const newAxios = axios.create({
    baseURL: process.env.VUE_APP_BASE_API,
    timeout: 10000,
    // headers:请求头
})
// 添加请求拦截器
newAxios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    let token = storage.get("sell_token")//将路由存进本地存储中
    if (token) {
        config.headers.Authorization = token
    }
    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});
// 添加响应拦截器
newAxios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response.data;//将返回的数据过滤留下我们需要的data
}, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
});
// 全封装
// 路径 方法 需要传输的数据
function request(url, method = "get", shuju = {}) {
    return newAxios({
        url,
        method,
        data: method == "post" ? qs.stringify(shuju) : '',
        params: method == "get" ? shuju : ''
    })
}
//全封装
function post(url, shuju) {
    return request(url, "post", shuju)
}
function get(url, shuju) {
    return request(url, "get", shuju)
}
export default {
    post, get//暴露
}

localstorage封装

在 utils 目录下创建 storage.js 文件 内容为:

const storage = window.localStorage
export default {
    set(key, value) { storage.setItem(key, JSON.stringify(value)) },//设置
    get(key) { return JSON.parse(storage.getItem(key)) },//获取
    isKey(key) { return storage.getItem(key) ? true : false },//判断
    clear() { storage.clear() },//清空
    remove(key) { storage.removeItem(key) },//清除一个
}

挂载到全局 main.js中

import storage from './utils/storage'

Vue.prototype.$storage = storage

### VueAxios二次封装及使用 #### 封装背景 为了提高代码的可维护性和复用性,在实际开发中通常会对 Axios 进行二次封装。通过封装可以统一处理请求拦截器、响应拦截器以及错误提示等功能。 --- #### 1. 安装依赖库 在项目根目录下执行以下命令来安装所需的依赖包: ```bash npm install axios element-plus --save ``` --- #### 2. 创建 `request.js` 文件 以下是 `utils/request.js` 的实现示例: ```javascript // utils/request.js import axios from 'axios'; import { ElMessage } from 'element-plus'; const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 设置基础路径,可以在 .env 文件中定义 timeout: 5000, // 超时时间 (毫秒) }); // 请求拦截器 service.interceptors.request.use( config => { const token = localStorage.getItem('token'); // 假设 token 存储在本地存储中 if (token) { config.headers['Authorization'] = `Bearer ${token}`; // 添加认证头 } return config; }, error => { console.error(error); // 打印请求失败日志 Promise.reject(error); } ); // 响应拦截器 service.interceptors.response.use( response => { const res = response.data; if (res.code !== 200) { // 自定义业务状态码判断逻辑 ElMessage.error(res.message || 'Error'); return Promise.reject(new Error(res.message || 'Request failed')); } else { return res; } }, error => { let message = ''; if (error && error.response) { switch (error.response.status) { case 401: message = 'Unauthorized'; break; case 403: message = 'Forbidden'; break; case 404: message = 'Not Found'; break; default: message = error.response.statusText; } } else { message = error.message; } ElMessage.error(message); return Promise.reject(error); } ); export default service; ``` 此部分实现了对 Axios 实例的基础配置和拦截器功能[^1]。 --- #### 3. API 方法封装 创建一个通用的接口调用工具类,用于简化 HTTP 请求操作。例如 `api.js` 文件如下所示: ```javascript // api.js import request from '@/utils/request'; // GET 请求封装 export function get(url, params = {}) { return request({ url, method: 'get', params, }); } // POST 请求封装 export function post(url, data = {}, headers = null) { return request({ url, method: 'post', data, headers, }); } ``` 此处提供了两个常用方法:`get` 和 `post`,分别对应 GET 和 POST 请求[^2]。 --- #### 4. 使用封装后的请求方法 在组件或其他模块中引入封装好的 API 工具类即可轻松发起网络请求。下面是一个简单的例子: ```javascript // src/views/example.vue <template> <div>{{ result }}</div> </template> <script> import { ref } from 'vue'; import { get, post } from '@/api'; export default { setup() { const result = ref(''); async function fetchData() { try { const response = await get('/example-endpoint', { id: 123 }); result.value = JSON.stringify(response); } catch (error) { console.error('Fetch Data Failed:', error); } } fetchData(); return { result, }; }, }; </script> ``` 在此处展示了如何利用封装的方法完成数据获取,并将其绑定到模板中的变量上。 --- #### 配置 Vite 环境支持 如果当前项目基于 Vite 构建,则需调整 vite.config.js 来适配环境变量加载需求。例如: ```javascript // vite.config.js import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; export default defineConfig({ plugins: [vue()], server: { proxy: { '/api': { target: 'http://localhost:8080', // 后端服务地址 changeOrigin: true, rewrite: path => path.replace(/^\/api/, ''), }, }, }, }); ``` 以上设置允许前端应用通过代理访问后端资源而无需担心问题。 --- ### 总结 通过对 Axios二次封装,不仅可以提升项目的灵活性与扩展能力,还能有效减少重复劳动量。同时借助 Element Plus 提供的消息通知组件进一步增强了用户体验质量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值