Vue【实战三件套】如何封装网络请求、如何解决跨域问题,如何使用mock模拟后端数据,快来一起来看看吧~

news2025/1/16 1:57:38
一、如何封装网络请求

1.新建项目

vue create item_1

2.src下新建文件config.js

什么是开发环境
在一个产品的前端开发过程中,一般来说会经历本地开发、测试脚本、开发自测、测试环境、预上线环境,然后才能正式的发布。对应每一个环境可能都会有所差异,比如说用户访问资源权限、服务器地址、接口地址等。在各个环境切换的时候,就需要不同的配置参数,所以就可以用环境变量和模式,来方便我们管理。

NODE_ENV是一个由 Node.js 暴露给执行脚本的系统环境变量。通常用于确定在开发环境还是生产环境(dev-vs-prod)下,服务器工具、构建脚本和客户端 library 的行为。

if(process.env.NODE_ENV === 'development'){ 
    //开发环境 do something
}else{
    //生产环境 do something
}

先来看一下process和process.env的官方解释:

process 对象是一个 global (全局变量),提供有关信息,控制当前 Node.js 进程。作为一个对象,它对于 Node.js
应用程序始终是可用的,故无需使用 require()。

process.env

process.env属性返回一个包含用户环境信息的对象。

首先配置开发环境和生产环境的地址
在这里插入图片描述

npm install axios

新建axios文件
在这里插入图片描述

import axios from "axios";
import config from "../../config"
const baseUrl = process.env.NODE_ENV === "development" ? config.baseUrl.dev : config.baseUrl.pro//判断是否是开发还是生产环境
class HttpRequest{
    constructor(//构造器
        baseUrl
    ){
        this.baseUrl = baseUrl;
        this.queue = {}
    }
    interceptors(instance,url){ //拦截
        instance.interceptors.request.use(config => {
        return config;
        }),error => {
            return {
                error:"网络出错"
            };
        };
        instance.interceptors.response.use(res => {
            return res.data;
        }),error => {
            return {
                error:"网络出错"
            };
        }

    }
    getInsideConfig(){
    const config = {
        baseURL:this.baseUrl,
        header:{
        }//配置
    }
        return config;
    }
    request(options){
        const instance = axios.create();
        options = Object.assign(this.getInsideConfig(), options)//ES6合并集合
        this.interceptors(instance,options.url)
        return instance(options);
    }
}
const axiosObj = new HttpRequest(baseUrl)
export default axiosObj;

新建data.js
传入配置参数

import axios from "../axios/axios"
export const getBannerData = ()=>{
    return axios.request({url:'banner',method:'get'})
}
export const getTabData = ()=>{
    return axios.request({url:'tabBarData',method:'get'})
}

渲染ui

  async mounted() {
    let result = await getBannerData();
    console.log(result);
        let results = await getTabData();
    console.log(results);
  }
二、如何解决跨域问题

同源策略
同源策略是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源
跨域
顾名思义,非同源请求就是跨域
如何解决跨域问题

三种前端跨域方法

普通跨域请求:只服务端设置Access-Control-Allow-Origin即可,前端无需设置;若要带cookie请求:前后端都需要设置。

通过Access-Control-Allow-Origin响应头,就告诉了浏览器。如果请求我的资源的页面是我这个响应头里记录了的"源",则不要拦截此响应,允许数据通行。

举例
node搭建简单的后台服务

let express = require('express');
let app = express();
app.use((req,res,next) => {
    res.append('Access-Control-Allow-Origin', '*');//服务器设置CORS,允许浏览器跨域
    res.append('Access-Control-Allow-Content-Type', '*');
    res.append('Access-Control-Allow-headers', '*');
    next();
})
app.get('/banner',(req,res) => {
    res.json({
        msg: '这是banner'
    })
})
app.listen(3000,() => {
    console.log('http://localhost:3000')
})

在这里插入图片描述

代理跨域
vue3演示代理跨域
新建vue.config.js

const {
  defineConfig
} = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  devServer: {
    proxy: {

      '/api': {

        target: 'http://localhost:3000', //这里填入你要请求的接口的前缀

        ws: true, //代理websocked

        changeOrigin: true, //虚拟的站点需要更换origin

        secure: true, //是否https接口,我用的http但是我变成false他打包后会报错,所以先true

        pathRewrite: {

          '^/api': '' //重写路径

        }

      }

    }

  }
})

在这里插入图片描述

谷歌浏览器设置跨域

如何使用mock模拟后端数据
npm install mockjs

新建mock.js
在这里插入图片描述

// 使用 Mock
var Mock = require('mockjs')
//请求延迟
Mock.setup({
    timeout:1000
})
Mock.mock('/api/tabBarData',{
    "username":"凌霄",
    "age":10
})

main文件中引入

在这里插入图片描述

if( process.env.NODE_ENV === "development") {
     require('@/api/mock')
}
使用rem
(function() {
    function resize() {
        //设计稿的宽度是750px 设计稿的100px相当于1rem 屏幕宽度相当于7.5rem
        var designWidth = 750;
        var baseFontSize = 100;
        var width = window.innerWidth;
        var currrentFontSize = (width / designWidth) * 100;
        console.log(currrentFontSize)
        document.querySelector('html').style.fontSize = currrentFontSize + 'px'
    }
    window.onresize = function () {
        resize();
    }
    document.addEventListener('DOMContentLoaded', resize)
}())

gitHub源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19101.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IPD-全面认识IPD流程

一、商业实现角度透视IPD流程 基于IPD的商业实现过程包括商业机会—商业计划—商业开发—商业兑现。这个过程适用于所有行业,适用于所有创新型市场化企业,包括贸易型企业、外包解决方案型企业、投资型企业等。 商业机会包括市场管理过程中的市场洞察和机会分析,以及需…

[MQ] MQ的应用场景及Docker安装RabbitMQ

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专…

PGL图学习之图神经网络GraphSAGE、GIN图采样算法[系列七]

0. PGL图学习之图神经网络GraphSAGE、GIN图采样算法[系列七] 本项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5061984?contributionType1 相关项目参考:更多资料见主页 关于图计算&图学习的基础知识概览:前置知识点学…

CEAC之《计算机应用助理工程师》3

👨‍💻个人主页:微微的猪食小窝 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 微微的猪食小窝 原创 收录于专栏 【CEAC证书】 1在子数据表中最多可以嵌套多少级子数据表? A、5级 B、6级 C、7级 D、8级D2在窗…

leetcode-每日一题-1732-找到最高海拔(简单,数学思想)

今天的每日一题很简单就是一个数学思考没啥难度 有一个自行车手打算进行一场公路骑行,这条路线总共由 n 1 个不同海拔的点组成。自行车手从海拔为 0 的点 0 开始骑行。 给你一个长度为 n 的整数数组 gain ,其中 gain[i] 是点 i 和点 i 1 的 净海拔高度…

mmdetection训练得到的权重/checkpoints文件分析

这篇文章对mmdetection训练得到的模型权重,或者说checkpoints文件进行分析,一般模型保存在work-dir文件夹下,具体路径要参考训练用到的config,即配置文件。保存的模型一般是.pt的文件。 .pt模型文件读取方法 这种模型文件可以用…

详解Unity中的Nav Mesh新特性|导航寻路系统 (三)

前言 通过前面两篇的介绍与讲解我们已经对新版NavMesh有了一个基础的了解和使用,本篇我们继续讲解剩余的两个组件NavMeshModifier、NavMeshModifierVolume,这两个组件是主要是用于影响导航网格的生成的。所以内容不是很主要,但也非常重要。 …

dubbo:从零理解及搭建dubbo微服务框架(一)

0.引言 dubbo作为阿里巴巴开源的微服务框架,提供了高性能的RPC调用。同时因为有阿里的背书,在国内市场得到了广泛应用,dubbo的开源工作在2018年2月阿里将项目捐献给apache基金会后,得到了更加广大的发展。 之前我们讲解了spring…

[相向双指针] 167. 两数之和 II - 输入有序数组,15. 三数之和,11. 盛最多水的容器,42. 接雨水

相向双指针 该文结合灵神讲解进行编码:https://www.bilibili.com/video/BV1bP411c7oJ 相向双指针一般用于有序的数组,两个指针分别从头和尾向中间遍历,直到找到满足条件的 ans。 167. 两数之和 II - 输入有序数组 https://leetcode.cn/pr…

声明式查询服务,只需定义,无需实现

1. 概览 在日常开发中,数据查询是最为常见的需求,也是占比最大的一部分。为了降低成本提升开发效率,已经封装了两个组件: 将 QueryObject 与 Spring Data Jpa 进行集成,无需编写实现代码,只需通过注解定义…

大厂永恒敲门砖——Android 系统启动流程详解

正文 AMS 是 Android 中最核心的服务之一,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,它本身也是一个 Binder 的实现类,应用进程能通过 Binder 机制调…

【Java开发】 Spring 04:云服务器 Docker 环境下安装 Redis 并连接 Spring 项目实现简单 CRUD

Redis是目前使用最多的缓存,包括Spring Boot 中我们也是会用Redis做很多事情。它是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库,具备数据持久化、多数据结构存储及数据备份等特点。Redis 和 Mongo 同属于文档型数据…

C++17新特性的使用场景总结

一、简单特性 1. namespace 嵌套 C17使我们可以更加简洁使用命名空间&#xff1a; 2. std::variant 升级版的C语言Union 在C17之前&#xff0c;通常使用Union来定义一个可以存储不同类型的变量&#xff0c;现在可以通过std::variant<T1,T2,...> 来定义一个可以存储不同…

Day2.

文章目录一、回文日期1、题目描述2、输入描述3、输出描述4、参考代码二、杨辉三角形1、题目描述2、输入描述3、输出描述4、参考代码一、回文日期 1、题目描述 2020 年春节期间&#xff0c;有一个特殊的日期引起了大家的注意&#xff1a;2020 年 2 月 2 日。因为如果将这个日期…

【2022年11月19日提高A组】消圈策略【DP】

思路&#xff1a; dis i 代表1 到 i 的最短路 因为它要求没有负环 无负环和可以求出最短路是充要条件 然后dis i 和 dis (i1)相差最多不超过1 因为有0边的存在 然后就对边的大小进行分类讨论 如果i<j即e i,j 为-1 那么dis (i) - 1 > dis j 然后移项 dis i - dis j > 1…

云原生|kubernetes|部署MySQL一主多从复制集群(基于GTID的复制)

前言&#xff1a; 一&#xff0c; MySQL的主从复制优点如下&#xff1a; 数据更安全&#xff1a;做了数据冗余&#xff0c;不会因为单台服务器的宕机而丢失数据 性能大大提升&#xff1a;一主多从&#xff0c;不同用户从不同数据库读取&#xff0c;性能提升 扩展性更优&…

如何使用Jekyll在GitHub Pages上搭建网站(个人博客)

本文很长&#xff0c;建议使用侧边栏进行跳转。 前言 Jekyll 是一个基于 Ruby 语言的&#xff0c;用于搭建静态网站的生成器&#xff0c;主要用于搭建博客网站&#xff08;官方自己的介绍为&#xff1a;Jekyll is a blog-aware, static site generator in Ruby&#xff09;。…

html制作网页案例代码----(故宫博物馆9页)特效很多

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 茶文化网站 | 中华传统文化题材 | 京剧文化水墨风书画 | 中国民间年画文化艺术网站 | 等网站的设计与制作 | HTML期末大学生网页设计作业&#xff0c;We…

Tauri+Vite+Vue3创建项目步骤

1、按照官网文档创建tauri项目 npm create tauri-app 然后按顺序填&#xff1a; 1、项目名称&#xff1a; 2、选择你的package manager 3、选择你的前端框架 然后再一步一步执行下面命令 cd 刚才创建的项目名称 npm install npm run tauri dev 然后出现 第一次可能没有反…

基于java+ssm的理论课_考勤,作业,签到管理系统

本理论课管理系统采用目前最流行的ssm框架和eclipse编辑器、mysql数据库设计并实现的 。主要包括登录模块、课程信息管理模块、考勤信息管理模块、成绩管理模块、和退出模块等多个模块 本系统基于SSM(SpringSpringMVCMyBatis)框架,适用于毕业设计&#xff0c;采用javaweb,基于B…