vue3硅谷甄选02 | 封装svg组件 - axios二次封装

news2024/11/17 21:52:29

文章目录

  • vue3硅谷甄选02
    • 功能1:封装svg组件
      • SVG图标配置
      • svg封装成组件
      • svg组件注册为全局组件
        • 自定义统一注册全局组件的插件
        • 自定义插件的原理
          • 插件的使用 app.use(plugin, [options])
    • 功能2:axios二次封装
      • 使用mock插件构造数据
      • axios二次封装
      • api接口统一管理
        • 问题:import type和import的区别
      • 请求拦截器与响应拦截器的原理

vue3硅谷甄选02

还在更新中 最后更新时间9.26

功能1:封装svg组件

SVG图标配置

在开发项目的时候经常会用到svg矢量图,对页面性能有很大的提升。而且SVG文件比img要小的很多,放在项目中几乎不占用资源。

安装SVG管理插件

  • 预加载 在项目运行时就生成所有图标,只需操作一次 dom
  • 高性能 内置缓存,仅当文件被修改时才会重新生成
pnpm install vite-plugin-svg-icons -D

vite.config.ts中配置插件

//引入svg需要用到插件
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'
export default () => {
  return {
    plugins: [
      // .....
      createSvgIconsPlugin({
        // svg图标的存储位置
        iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
        // Specify symbolId format
        symbolId: 'icon-[dir]-[name]',
      }),
    ],
  }
}

入口文件导入

import 'virtual:svg-icons-register'

测试:在vue文件中使用svg

// svg 标签相当于容器 use表示使用svg图标,xlink:href的属性值标识执行哪一个图标 #icon-xxx 这里的xxx是svg的图标名。fill属性表示填充的颜色。
// 这里不用引入,会去配置的src/assets/icons下找文件。
  <svg> //svg的width和height属性可以调节图标的大小
    <use xlink:href="#icon-phone" fill='red'></use>
  </svg>

svg 和 use标签 属于 SVG Sprite 技术,介绍项目的时候可以说使用了SVG Sprite 技术(可以搜索了解下)。

svg封装成组件

很多模块都需要使用图标,为了方便使用,将svg封装为组件。

//src/components/SvgIcon/index.vue
<template>
  <svg :style="{width,height}">
    <use :xlink:href = "prefix+name" :fill="color"></use>
  </svg>
</template>

<script setup lang="ts">
interface iconConfig {
  prefix?: string, //:xlink:href属性值的前缀
  name: string,
  color?: string,
  width?: string,
  height?: string,
}
//接受父组件传递过来的参数
withDefaults(defineProps<iconConfig>(), {
  prefix:'#icon-',
  color:'' ,
  width:'16px',
  height:'16px',
})
</script>

svg组件注册为全局组件

全局组件注册语法:vue.conponent('组件名',组件值)

项目的文件结构很复杂,引入时路径寻找很麻烦。将svg组件注册为全局组件,就不用每次使用时都引入。

// main.ts
import SvgIcon from '@/components/SvgIcon/index.vue'
app.component('SvgIcon', SvgIcon) //第一个参数为组件名,第二个参数为对应组件

注册完成后可以在任意组件中不引入就使用

<svg-icon name="xxx" color="xxx" width="xxx" height="xxx"></svg-icon>

存在问题:如果有100个全局组件就需要注册100次全局组件
解决办法:自定义插件实现统一注册全局组件的功能

自定义统一注册全局组件的插件

插件的作用:注册整个项目的全局组件

插件的使用

//main.ts
import gloalComponent from '@/components'
//安装自定义插件
app.use(gloalComponent);

app.use(插件)实际上就是调用插件的install(),还会把app应用实例传参给install方法

插件的定义

实现原理:install方法的参数是app应用实例,可以利用app应用实例的component方法注册全局组件。

//components/index.ts
import SvgIcon from './SvgIcon/index.vue'
// 有新的全局组件可以引入后,添加进allGloablComponent 对象
const allGloablComponent = { SvgIcon }
// 对外暴露插件对象
export default {
  //接受app应用实例参数
  install(app) {
    Object.keys(allGloablComponent).forEach((key) => {
      app.component(key, allGloablComponent[key])
    })
  },
}

引出知识点:如何自定义插件?自定义插件的原理是什么?

自定义插件的原理

插件文件的类型

  • 包含install方法的对象
  • 函数,这个函数被当作install方法。

install(app, options)

  • app:app应用实例
  • options:传入的选项
插件的使用 app.use(plugin, [options])
  • 语法:app.use(plugin, [options])
  • 作用:app.use(plugin)执行时相当于执行插件的install(),将app应用实例传递给install()的第一个参数
  • 返回值:返回一个应用实例,可以链式添加新的插件
  • 参数
    • plugin 使用的插件名
    • options 执行插件时将options参数传递给install方法的第二个参数

use方法的原理

  • 利用Set结构存储插件,当存在该插件时抛出异常;app.use会自动阻止多次注册相同插件。
  • 通过判断是否存在install方法或是否是函数,执行对应的插件。
  • 执行插件时将app上下文实例和options作为参数传入。
  • 返回app实例,实现链式调用
function createApp(rootComponent, rootProps = null) {
    // ……
    const installedPlugins = new Set();
    const app = (context.app = {
        // ……
        use(plugin, ...options) {
            if (installedPlugins.has(plugin)) {
                warn(`Plugin has already been applied to target app.`);
            }
            else if (plugin && shared.isFunction(plugin.install)) {
                installedPlugins.add(plugin);
                plugin.install(app, ...options);
            }
            else if (shared.isFunction(plugin)) {
                installedPlugins.add(plugin);
                plugin(app, ...options);
            }
            else {
                warn(`A plugin must either be a function or an object with an "install" ` +
                    `function.`);
            }
            return app;
        },
        // ……
    });
    return app;
};

功能2:axios二次封装

使用mock插件构造数据

作用:mockjs 生成随机数据。当前端使用mock模拟的数据接口时,mockjs进行数据返回,并拦截ajax请求不发送给后台。

1.安装依赖

pnpm install -D vite-plugin-mock mock.js

这里vite-plugin-mock的版本为2.9.6,vite-plugin-mock@2.9.6下载指定版本

2.在 vite.config.js 配置文件启用插件

import { UserConfigExport, ConfigEnv } from 'vite'
import { viteMockServe } from 'vite-plugin-mock'
import vue from '@vitejs/plugin-vue'
export default ({ command })=> {
  return {
    plugins: [
      vue(),
      viteMockServe({
       mockPath: './src/mock',//!!!!!!
        localEnabled: command === 'serve',
      }),
    ],
  }
}

老师视频把mockPath删除了,我删除之后会报错404,这里不能删除!

在根目录创建mock文件夹,mock文件夹里面存放假数据。

在mock文件夹下创建user.ts

//用户信息数据
//createUserList函数执行返回一个数组,数组里的每一个元素是一个用户
function createUserList() {
    return [
        {
            userId: 1,
            avatar:
                'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
            username: 'admin',
            password: '111111',
            desc: '平台管理员',
            roles: ['平台管理员'],
            buttons: ['cuser.detail'],
            routes: ['home'],
            token: 'Admin Token',
        },
        {
            userId: 2,
            avatar:
                'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
            username: 'system',
            password: '111111',
            desc: '系统管理员',
            roles: ['系统管理员'],
            buttons: ['cuser.detail', 'cuser.user'],
            routes: ['home'],
            token: 'System Token',
        },
    ]
}

//对外暴露一个数组,数组中包含两个接口
// 接口1:用户登录接口
// 接口2:获取用户信息接口
export default [
    // 用户登录接口
    {
        url: '/api/user/login',//请求地址
        method: 'post',//请求方式
        response: ({ body }) => {
            //获取请求体携带过来的用户名与密码
            const { username, password } = body;
            //调用获取用户信息函数,用于判断是否有此用户
            const checkUser = createUserList().find(
                (item) => item.username === username && item.password === password,
            )
            //没有用户返回失败信息
            if (!checkUser) {
                return { code: 201, data: { message: '账号或者密码不正确' } }
            }
            //如果有返回成功信息
            const { token } = checkUser
            return { code: 200, data: { token } }
        },
    },
    // 获取用户信息
    {
        url: '/api/user/info',
        method: 'get',
        response: (request) => {
            //获取请求头携带token
            const token = request.headers.token;
            //查看用户信息是否包含有token用户
            const checkUser = createUserList().find((item) => item.token === token)
            //没有返回失败的信息
            if (!checkUser) {
                return { code: 201, data: { message: '获取用户信息失败' } }
            }
            //如果有返回成功信息
            return { code: 200, data: {checkUser} }
        },
    },
]

可以使用axios 测试接口是否可用(前提是已经安装了axios)

axios({
		url: '/api/user /login',
		method:"post",
		data:{
			username:'admin',
			password:'111111',
   	}
})

axios二次封装

目的:使用axios的请求拦截器与响应拦截器

  • 请求拦截器:可以在请求拦截器中处理一些业务(开始进度条、请求头携带公共参数)
  • 响应拦截器:使用响应拦截器,可以在响应拦截器中处理一些业务(进度条结束、简化服务器返回的数据、处理http网络错误)

1.安装axios

pnpm i axios

2.二次封装axios,创建utils/request.js文件,其中utils文件夹存放常用功能性文件。

//引入axios
import axios from 'axios'
import { ElMessage } from 'element-plus'
/*
1.利用axios对象的方法create,去创建一个axios实例
2.参数是配置对象
*/
const requestAxios = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_API, //基础路径携带api,发送请求的时候不用写前面的api了,自动添加在前面
  timeout: 5000, //请求超时的时间5s
})

//请求拦截器
requestAxios.interceptors.request.use((config) => {
  //config:配置对象,headers请求头携带公共参数
  return config
})

//响应拦截器
//参数1成功的回调,参数2失败的回调
requestAxios.interceptors.response.use(
  (res) => {
    return res.data
  },
  (error) => {
    //案例:处理网络错误
    let msg = ''
    let status = error.response.status
    switch (status) {
      case 401:
        msg = 'token过期'
        break
      case 403:
        msg = '无权访问'
        break
      case 404:
        msg = '请求地址错误'
        break
      case 500:
        msg = '服务器出现问题'
        break
      default:
        msg = '无网络'
    }
    ElMessage({
      type: 'error',
      message: msg,
    })
    return Promise.reject(error)//终止promise链
  },
)

export default requestAxios

api接口统一管理

规范化接口管理,是项目接口请求逻辑更加清晰。

在这里插入图片描述
api/user为例

问题:import type和import的区别

请求拦截器与响应拦截器的原理

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

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

相关文章

【大数据开发技术】实验01-Hadoop安装部署

文章目录 Hadoop安装部署一、实验目标二、实验要求三、实验内容四、实验步骤附&#xff1a;系列文章 Hadoop安装部署 虚拟机数量&#xff1a;3 系统版本&#xff1a;Centos 7.5 Hadoop版本&#xff1a; Apache Hadoop 2.7.3 主节点信息&#xff1a; 操作系统&#xff1a;Cen…

Tomcat 与 JDK 对应版本关系

对应关系 Tomcat版本 jdk版本11.0.x JDK 21及以后10.1.x JDK11及以后10.0.xJDK1.8及以后9.0.x JDK1.8及以后8.5.xJDK1.7及以后8.0.x JDK1.7及以后 查看对应关系方法&#xff1a; 登陆Tomcat官网&#xff1a;Apache Tomcat - Welcome! 结果&#xff1a;

Arthas:Java调试利器使用

Arthas:Java调试利器使用 1. Arthas是什么2. Arthas可以解决什么问题Arthas启动方式1. jar启动2. 在线安装 远程连接命令使用- 退出threadclassloaderscsm watchtrace修改日志级别 1. Arthas是什么 Arthas(阿尔萨斯)是阿里开源的一个Java在线分析诊断工具. 2. Arthas可以解决…

C#(CSharp)入门实践项目(简易回合制游戏)

项目名称 木木夕营救公主 项目介绍 这是一个小游戏&#xff0c;你将扮演一个英雄&#xff08;木木夕&#xff09;&#xff0c;去打败恶龙&#xff0c;拯救出公主&#xff0c;该项目采用回合制战斗模式&#xff0c;由于角色的血量和攻击为随机数&#xff0c;所以需要靠运气才…

YOLOv7改进:CBAM注意力机制

目录 1.介绍 1.1、论文的出发点 1.2、论文的主要工作 1.3、CBAM模块的具体介绍 2.YOLOv7改进 2.1yaml 配置文件如下 2.2common.py配置 2.3yolo.py配置 1.介绍 1.1、论文的出发点 cnn基于其丰富的表征能力&#xff0c;极大地推动了视觉任务的完成&#xff0c;为了提高…

【MySql】3- 实践篇(一)

文章目录 1. 普通索引和唯一索引的选择1.1 查询过程1.2 更新过程1.2.1 change buffer1.2.2 change buffer 的使用场景 1.3 索引选择和实践1.4 change buffer 和 redo log2. MySQL为何有时会选错索引?2.1 优化器的逻辑2.1.1 扫描行数是怎么判断的?2.1.2 重新统计索引信息 2.2 …

一站式吃鸡利器,提升游戏战斗力,助您稳坐鸡王宝座!

各位吃鸡玩家们&#xff0c;听说过绝地求生作图工具吗&#xff1f;想知道如何提高游戏战斗力、分享顶级作战干货、查询装备皮肤库存&#xff1f;还在为游戏账号安全而担心吗&#xff1f;别急&#xff0c;今天就为您介绍一款一站式吃鸡利器&#xff0c;满足您的所有需求&#xf…

【使用工具】IDEA创建类及已有类添加注释-详细操作

1.背景 很多开发好多时候其实不太会给类添加注释&#xff0c;尤其是已经有的类&#xff0c;上网查询&#xff0c;好多文档错误百出&#xff0c;而且不全 2.正文 2.1新建类添加注释 idea给新建类创建注释有两种方式 先写一个简单的模板 /** * description: TODO * autho…

kotlin协程CoroutineScope Dispatchers.IO launch 线程Id

kotlin协程CoroutineScope Dispatchers.IO launch 线程Id import kotlinx.coroutines.*fun main(args: Array<String>) {println("main 线程id:${Thread.currentThread().threadId()}")CoroutineScope(Dispatchers.IO).launch {println("launch 线程id:$…

【JVM】第二篇 JVM内存模型深度剖析与优化

目录 一. JDK体系结构与跨平台特性介绍二. JVM内存模型深度剖析三. 从Jvisualvm来研究下对象内存流转模型四. GC Root与STW机制五. JVM参数设置通用模型一. JDK体系结构与跨平台特性介绍 二. JVM内存模型深度剖析 按照线程是否共享来划分 TLAB(Thread Local Allocation Buffer…

mybatis核心组件

title: “mybatis核心组件” createTime: 2021-12-08T12:19:5708:00 updateTime: 2021-12-08T12:19:5708:00 draft: false author: “ggball” tags: [“mybatis”] categories: [“java”] description: “mybatis核心组件” #mermaid-svg-AYu4pQutsPsK0P5T {font-family:&quo…

stm32 - 初识2

stm32 - 初识2 工程架构点灯程序寄存器方式点灯库函数的方式点灯 工程架构 启动文件 中断向量表&#xff0c;中断服务函数&#xff0c;其他中断等 中断服务函数中的&#xff0c;复位中断是整个程序的入口&#xff0c;调用systeminit&#xff0c;和main函数 点灯程序 寄存器方式…

自适应阈值分割-OTSU

OTSU 在前面固定阈值中选取了一个阈值为127进行阈值分割&#xff0c;那如何知道选的这个阈值效果好不好呢&#xff1f;答案是&#xff1a;不断尝试&#xff0c;所以这种方法在很多文献中都被称为经验阈值。 Otsu阈值法就提供了一种自动高效的二值化方法。Otsu算法也称最大类间…

C++之std::atomic类模板原子操作应用总结(二百三十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

JAVA+SpringBoot+VUE工厂车间管理系统(含论文)源码

springboot169基于vue的工厂车间管理系统的设计录像(毕业设计jdz2023) 一、源码描述 JAVASpringBootVUE工厂车间管理系统,包含源码数据库论文等,含MySQL脚本&#xff0c;基于B/S和Web开发的&#xff0c;感兴趣的朋友可以下载看看 二、功能介绍 1、个人中心 2、人员管理 3、设备…

计算机图像处理:图像轮廓

图像轮廓 图像阈值分割主要是针对图片的背景和前景进行分离&#xff0c;而图像轮廓也是图像中非常重要的一个特征信息&#xff0c;通过对图像轮廓的操作&#xff0c;就能获取目标图像的大小、位置、方向等信息。画出图像轮廓的基本思路是&#xff1a;先用阈值分割划分为两类图…

Textpad 缺少Java编译和运行功能

一、问题 缺少Java编译和运行功能 二、处理方法 1、点击菜单Configure->Preferences 2、点击 Tools -> Add -> Java SDK Commands 3、点击应用和确认 三、结果

现代 GPU 容易受到新 GPU.zip 侧通道攻击

来自四所美国大学的研究人员开发了一种新的 GPU 侧通道攻击&#xff0c;该攻击利用数据压缩在访问网页时泄露现代显卡中的敏感视觉数据。 研究人员通过 Chrome 浏览器执行跨源 SVG 过滤器像素窃取攻击&#xff0c;证明了这种“ GPU.zip ”攻击的有效性。 研究人员于 2023 年 …

【JVM】第五篇 垃圾收集器G1和ZGC详解

导航 一. G1垃圾收集算法详解1. 大对象Humongous说明2. G1收集器执行一次GC运行的过程步骤3. G1垃圾收集分类4. G1垃圾收集器参数设置5. G1垃圾收集器的优化建议6. 适合使用G1垃圾收集器的场景?二. ZGC垃圾收集器详解1. NUMA与UMA2. 颜色指针3. ZGC的运作过程4. ZGC垃圾收集器…

mysql面试题2:说一说MySQL的架构设计?一条 MySQL 语句执行的步骤?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说MySQL的架构设计? MySQL的架构设计主要包括以下几个组件: 连接器(Connector):负责与客户端建立连接,并进行身份验证和授权。 查询缓存…