【web】2、集成插件

1、element-plus

官网地址:设计 | Element Plus

安装 plus 及 icon 图标库

1.1 官网提供plus安装方法:

1.2 官网提供  icon 安装方法

1.3 安装 

pnpm install element-plus @element-plus/icons-vue

main.ts全局安装element-plus,element-plus默认支持语言英语设置为中文

import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css'
//@ts-ignore忽略当前文件ts类型的检测否则有红色提示(打包会失败)
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
app.use(ElementPlus, {locale: zhCn
})

1.4 图标全局配置

// main.ts// 如果您正在使用CDN引入,请删除下面一行。
import * as ElementPlusIconsVue from '@element-plus/icons-vue'const app = createApp(App)
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {app.component(key, component)
}

2、SVG图标配置

在开发项目的时候经常会用到svg矢量图,而且我们使用SVG以后,页面上加载的不再是图片资源,

这对页面性能来说是个很大的提升,而且我们SVG文件比img要小的很多,放在项目中几乎不占用资源。

官网地址:iconfont-阿里巴巴矢量图标库

2.1 安装svg图标库

pnpm install vite-plugin-svg-icons -D

2.2 vite.config.ts 中配置插件 

import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'
export default () => {return {plugins: [createSvgIconsPlugin({// Specify the icon folder to be cachediconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],// Specify symbolId formatsymbolId: 'icon-[dir]-[name]',}),],}
}

2.3 main.ts中导入插件

import 'virtual:svg-icons-register'

3、集成sass

我们目前在组件内部已经可以使用scss样式,因为在配置styleLint工具的时候,项目当中已经安装过sass sass-loader,因此我们再组件内可以使用scss语法!!!需要加上lang="scss"

<style scoped lang="scss"></style>

3.1 引入全局样式

新建目录 :src/styles 

reset.scss

在styles下 创建reset.scss 文件

html {-webkit-text-size-adjust: 100%
}html:focus-within {scroll-behavior: smooth
}body {-webkit-text-size-adjust: 100%;-moz-text-size-adjust: 100%;text-size-adjust: 100%;-moz-osx-font-smoothing: grayscale;-webkit-font-smoothing: antialiased;min-height: 100vh;position: relative;text-rendering: optimizeSpeed;width: 100%
}*, :after, :before {box-sizing: border-box
}a:not([class]) {-webkit-text-decoration-skip: ink;text-decoration-skip-ink: auto
}a, abbr, acronym, address, applet, article, aside, audio, b, big, blockquote, body, canvas, caption, center, cite, code, dd, del, details, dfn, div, dl, dt, em, embed, fieldset, figcaption, figure, footer, form, h1, h2, h3, h4, h5, h6, header, hgroup, html, i, iframe, img, ins, kbd, label, legend, li, mark, menu, nav, object, ol, output, p, pre, q, ruby, s, samp, section, small, span, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, time, tr, tt, u, ul, var, video {border: 0;font-size: 100%;font: inherit;margin: 0;padding: 0;vertical-align: baseline
}:focus {outline: 0
}article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section {display: block
}ol, ul {list-style: none
}blockquote, q {quotes: none
}blockquote:after, blockquote:before, q:after, q:before {content: "";content: none
}input, input:required {box-shadow: none
}input:-webkit-autofill, input:-webkit-autofill:active, input:-webkit-autofill:focus, input:-webkit-autofill:hover {-webkit-box-shadow: inset 0 0 0 30px #fff
}input[type=search]::-webkit-search-cancel-button, input[type=search]::-webkit-search-decoration, input[type=search]::-webkit-search-results-button, input[type=search]::-webkit-search-results-decoration {-webkit-appearance: none;-moz-appearance: none
}input[type=search] {-webkit-appearance: none;-moz-appearance: none
}input:focus {outline: none
}audio, canvas, video {display: inline-block;max-width: 100%
}audio:not([controls]) {display: none;height: 0
}[hidden] {display: none
}a:active, a:hover {outline: none
}img {height: auto;max-width: 100%;vertical-align: middle
}img, picture {display: inline-block
}button, input {line-height: normal
}button, html input[type=button], input[type=reset], input[type=submit] {-webkit-appearance: button;background: transparent;border: 0;cursor: pointer
}button[disabled], html input[disabled] {cursor: default
}[disabled] {pointer-events: none
}input[type=checkbox], input[type=radio] {padding: 0
}input[type=search] {-webkit-appearance: textfield;box-sizing: content-box
}input[type=search]::-webkit-search-cancel-button, input[type=search]::-webkit-search-decoration {-webkit-appearance: none
}button::-moz-focus-inner, input::-moz-focus-inner {border: 0;padding: 0
}button {background: transparent;border: 0
}textarea {overflow: auto;resize: vertical;vertical-align: top
}table {border-collapse: collapse;border-spacing: 0;text-indent: 0
}hr {background: #000;border: 0;box-sizing: content-box;height: 1px;line-height: 0;margin: 0;overflow: visible;padding: 0;page-break-after: always;width: 100%
}pre {font-family: monospace, monospace;font-size: 100%
}a {background-color: transparent
}abbr[title] {border-bottom: none;text-decoration: none
}code, kbd, pre, samp {font-family: monospace, monospace
}small, sub, sup {font-size: 75%
}sub, sup {line-height: 0;position: relative;vertical-align: baseline
}sub {bottom: -5px
}sup {top: -5px
}button, input, optgroup, select, textarea {font-family: inherit;font-size: 100%;line-height: 1;margin: 0;padding: 0
}button, input {overflow: visible
}button, select {text-transform: none
}[type=button], [type=reset], [type=submit], button {-webkit-appearance: button
}[type=button]::-moz-focus-inner, [type=reset]::-moz-focus-inner, [type=submit]::-moz-focus-inner, button::-moz-focus-inner {border-style: none;outline: 0;padding: 0
}legend {border: 0;color: inherit;display: block;max-width: 100%;white-space: normal;width: 100%
}fieldset {min-width: 0
}body:not(:-moz-handler-blocked) fieldset {display: block
}progress {vertical-align: baseline
}[type=number]::-webkit-inner-spin-button, [type=number]::-webkit-outer-spin-button {height: auto
}[type=search] {-webkit-appearance: textfield;outline-offset: -2px
}[type=search]::-webkit-search-decoration {-webkit-appearance: none
}::-webkit-file-upload-button {-webkit-appearance: button;font: inherit
}summary {display: list-item
}template {display: none
}

index.scss

在styles下新建index.scss

@import "./reset.scss";

在main.ts中引入 index.scss

import '@/styles'

global.scss

在styles下新建global.scss

//项目提供scss全局变量

将global.scss配置为全局样式组件

在vite.config.ts文件配置如下:

export default defineConfig((config) => {css: {preprocessorOptions: {scss: {javascriptEnabled: true,additionalData: '@import "./src/styles/global.scss";',},},},
}

@import "./src/styles/variable.less";后面的;不要忘记,不然会报错!

4、封装全局组件

4.1配置全局组件引入

4.1.1 创建index.ts

src/components 下新建index.ts文件

export default {install(app: any) {},
}

4.1.2 main.ts中引入

import globalComponent from '@/components'//引入全局组件
app.use(globalComponent)

4.2 将element-plus/icon-vue 配置为全局引入

index.ts中加入icon-vue的全局处理代码片段

import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import type { App, Component } from 'vue';export default {install(app: any) {for (const [key, component] of Object.entries(ElementPlusIconsVue)) {app.component(key, component)}},
}

4.2 配置全局SvgIcon

4.2.1编写SvgIcon自定义组件

src/components/SvgIcon/index.vue

<template><!-- svg:图标外层容器节点,内部需要与use标签结合使用 --><svg :style="{ width, height }"><!-- xlink:href执行用哪一个图标,属性值务必#icon-图标名字 --><!-- use标签fill属性可以设置图标的颜色 --><use :xlink:href="prefix + name" :fill="color"></use></svg>
</template><script setup lang="ts" name="SvgIcon">
//接受父组件传递过来的参数
defineProps({//xlink:href属性值前缀prefix: {type: String,default: '#icon-',},//提供使用的图标名字name: String,//接受父组件传递颜色color: {type: String,default: '',},//接受父组件传递过来的图标的宽度width: {type: String,default: '16px',},//接受父组件传递过来的图标的高度height: {type: String,default: '16px',},
})
</script><style scoped></style>

4.2.2 引入到全局组件中

import SvgIcon from '@/components/SvgIcon/index.vue'
const allGlobalComponents: any = {SvgIcon,
}export default {install(app: any) {Object.keys(allGlobalComponents).forEach((key) => {app.component(key, allGlobalComponents[key])})},
}

4.2.3 引用

<SvgIcon name="full" color="#fff" width="100%" height="100%"></SvgIcon>

4.3配置全局三级下拉选项

4.3.1 编写 Category组件

src/components/Category/index.vue

<template><el-card class="select-container"><el-form inline><el-form-item label="一级分类"><el-selectv-model="category.c1Id"@change="changeC1":disabled="scene == 1"><el-optionv-for="item in category.c1List":key="item.id":label="item.name":value="item.id"></el-option></el-select></el-form-item><el-form-item label="二级分类"><el-selectv-model="category.c2Id"@change="changeC2":disabled="scene == 1"><el-optionv-for="item in category.c2List":key="item.id":label="item.name":value="item.id"></el-option></el-select></el-form-item><el-form-item label="三级分类"><el-selectv-model="category.c3Id"@change="props.setIds({c1Id: category.c1Id,c2Id: category.c2Id,c3Id: category.c3Id,})":disabled="scene == 1"><el-optionv-for="item in category.c3List":key="item.id":label="item.name":value="item.id"></el-option></el-select></el-form-item></el-form></el-card>
</template><script setup lang="ts">
import { onMounted, reactive } from 'vue'const props = defineProps(['getCategory', 'setIds', 'scene'])
let category = reactive<any>({c1List: [],c2List: [],c3List: [],c1Id: '',c2Id: '',c3Id: '',
})const changeC1 = async () => {category.c2Id = ''category.c3Id = ''props.setIds({c1Id: '',c2Id: '',c3Id: '',})let res = await props.getCategory(2, category.c1Id)if (res.length > 0) {category.c2List = res}
}const changeC2 = async () => {category.c3Id = ''props.setIds({c1Id: '',c2Id: '',c3Id: '',})let res = await props.getCategory(3, category.c2Id)if (res.length > 0) {category.c3List = res}
}onMounted(async () => {let res = await props.getCategory(1, 0)if (res.length > 0) {category.c1List = res}
})
</script>
<script lang="ts">
export default {name: 'Category',
}
</script><style scoped lang="scss">
.el-form-item {.el-select {width: 200px;}
}
</style>

4.3.2 引入到全局组件中

import Category from '@/components/category/index.vue'const allGlobalComponents: any = {Category,
}export default {install(app: any) {Object.keys(allGlobalComponents).forEach((key) => {app.component(key, allGlobalComponents[key])})},
}

4.3.3 stores存储属性值

import { defineStore } from 'pinia'
import { reqCategoryList } from '@/api/product/attr'
import { ElMessage } from 'element-plus'export const useProductAttrStore = defineStore('ProductAttr', () => {const getCategory = async (type: number, categoryId: number) => {const result = await reqCategoryList(type, categoryId)if (result.code == 200) {return result.data} else {ElMessage({message: '查询分类失败',type: 'error',})return []}}return { getCategory }
})

4.3.4 引用

<Category:getCategory="attrStore.getCategory":setIds="setIds":scene="scene"/>
<script setup lang="ts">
import { useProductAttrStore } from '@/stores/models/product/attr'
import { reactive, ref } from 'vue'let scene = ref(0)
let attrValueList = ref([])const attrStore = useProductAttrStore()const attrParams = reactive({attrName: '',attrValueList: [],categoryId: '',categoryLevel: 3,
})const ids = reactive({c1Id: '',c2Id: '',c3Id: '',
})const setIds = async (idData: any) => {Object.assign(ids, idData)await getAttrValueList()
}
const getAttrValueList = async () => {if (ids.c3Id != '') {scene.value = 0let result = await reqAttrInfoList(ids.c1Id, ids.c2Id, ids.c3Id)if (result.code === 200) {attrParams.categoryId = ids.c3IdattrValueList.value = result.data}} else {attrValueList.value = []}
}</script>

4.4 分页pagination

4.4.1 编写分页组件

<template><el-paginationv-model:current-page="page_attr.currentPage"v-model:page-size="page_attr.pageSize":page-sizes="[1, 2, 3, 4, 5]"backgroundlayout="prev, pager, next, -> ,total, sizes":total="page_attr.total"@size-change="handleSizeChange"@current-change="handleCurrentChange"/>
</template><script setup lang="ts">
import { onMounted, reactive } from 'vue'const props = defineProps(['select'])//分页器
const page_attr = reactive({currentPage: 1,pageSize: 2,total: 10,
})const handleSizeChange = (val: number) => {page_attr.pageSize = valpage_attr.currentPage = 1handleCurrentChange()
}
const handleCurrentChange = async () => {page_attr.total = await props.select(page_attr.currentPage,page_attr.pageSize,)
}onMounted(async () => {await handleCurrentChange()
})
</script>
<script lang="ts">
export default {name: 'Pagination',
}
</script><style scoped lang="scss"></style>

4.4.2 引入到全局组件中

import Pagination from '@/components/pagination/index.vue'const allGlobalComponents: any = {Pagination,
}export default {install(app: any) {Object.keys(allGlobalComponents).forEach((key) => {app.component(key, allGlobalComponents[key])})},
}

4.4.3 引用

<Pagination :select="select" /><script setup lang="ts">let tradeMarkList = ref()//分页
const select = async (currentPage: number, pageSize: number) => {//下面为具体型业务逻辑let result = await reqTradeMarkList(currentPage, pageSize)tradeMarkList.value = result.data.recordsreturn result.data.total
}
</script>

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

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

相关文章

matlab编辑稀疏单位方阵

创建 10001000 稀疏单位方阵&#xff0c;并查看稀疏模式。 &#xff08;1&#xff09; I speye(1000); spy(I)&#xff08;2&#xff09; S speye(400,800); spy(S)此命令等同于 speye([400 800])。

Nginx中封装的数据结构

Nginx中封装的数据结构 Nginx中封装的数据结构整型ngx_str_t【字符串】ngx_list_t【链表】ngx_table_elt_t【key/value】ngx_buf_tngx_chain_t Nginx中封装的数据结构 整型 typedef intptr_t ngx_int_t; typedef uintptr_t ngx_uint_t;ngx_str_t【字符串】 typ…

qt6开发环境配置杂记

很多同学不重视环境配置问题&#xff0c;这是工程问题&#xff0c;实际工作中&#xff0c;如果不真正搞懂环境配置&#xff0c;后期可能会遇到各种坑。 QT是一套开发框架&#xff0c;最终要翻译成c去执行。总体而言&#xff0c;就是下面三张框图&#xff1a; &#xff08;工程…

Spring底层原理之bean的加载方式一 用XML方式声明bean 自定义bean及加载第三方bean 2024详解

目录 用XML方式声明bean 首先我们创建一个空的java工程 我们要导入一个spring的依赖 注意在maven工程里瞅一眼 我们创建一个业务层接口 还有四个实现类 我们最初的spingboot生命bean的方式是通过xml声明 我们在resources文件夹下创建一个配置文件 我们书写代码 首先初…

AI Agent:技术原理与未来趋势

在人工智能的快速发展中&#xff0c;AI Agent作为一项创新技术&#xff0c;正逐渐成为研究和应用的热点。AI Agent不仅仅是执行命令的程序&#xff0c;它们能够感知环境、做出决策并采取行动&#xff0c;展现出类似人类的群体协作能力。本文将探讨AI Agent的技术原理、开源框架…

使用vite官网和vue3官网分别都可以创建vue3项目

问: npm init vitelatest 和 npm create vuelatest创建的vue3项目有什么区别? 回答: npm init vitelatest 和 npm create vuelatest 分别是使用 Vite 和 Vue CLI 工具创建 Vue 项目的两种方式&#xff0c;它们之间有几个主要区别&#xff1a; 1. **构建工具&#xff1a;** …

忍法:声音克隆之术

前言&#xff1a; 最近因为一直在给肚子里面的宝宝做故事胎教&#xff0c;每天&#xff08;其实是看自己心情抽空讲下故事&#xff09;都要给宝宝讲故事&#xff0c;心想反正宝宝也看不见我&#xff0c;只听我的声音&#xff0c;干脆偷个懒&#xff0c;克隆自己的声音&#xf…

Linux CentOS 宝塔 Suhosin禁用php5.6版本eval函数详细图文教程

方法一&#xff1a;PHP_diseval_extension禁用 Linux CentOS 禁用php的eval函数详细图文教程_centos php 禁用 eval-CSDN博客 这个方法make报错&#xff0c;懒得费时间处理&#xff0c;直接用第二种 方法二&#xff1a;suhosin禁用 不支持PHP8&#xff0c;官方只支持PHP7以下…

【电源专题】为什么带电量计芯片的电池MOS保护要放在高侧

在实际的电量计电池开发中,发现一个很奇怪的现象。传统电池保护IC往往都是将充电保护和放电保护的两个MOS管放在低侧的。如下所示是文章:【电源专题】读一读单节锂电池保护IC规格书 可以看到M1和M2两个MOS管是放在PB-(也就是电池的负端),我们叫做低端。 而BQ28Z610电…

目标检测常用涨点方法:注意力机制小结(空间注意力、通道注意力、CBAM等)

1.通道注意力 通道注意力&#xff08;Channel Attention&#xff09;是在通道维度上对输入数据进行学习&#xff0c;再对不同的通道分配相应的权重表示重要性&#xff0c;从而达到“分配注意力”的效果。SENet&#xff08;Squeeze and Excitation networks) 是一个典型的使用通…

Swift宏的实现

上篇介绍了Swift宏的定义与生声明&#xff0c;本篇主要看看是Swift宏的具体实现。结合Swift中Codable协议&#xff0c;封装一个工具让类或者结构体自动实现Codable协议&#xff0c;并且添加一些协议中没有的功能。 关于Codable协议 Codable很好&#xff0c;但是有一些缺陷&…

yaklang window安装 vscode运行得到“hello world”

资源来源&#xff1a;旅程伊始&#xff1a;Yak 语言环境安装与搭建环境 | Yak Program Language 安装yak语言非常简单&#xff0c;管理员权限打开命令行运行以下命令&#xff1a; powershell (new-object System.Net.WebClient).DownloadFile(https://yaklang.oss-cn-beijing…

1085 PAT单位排行(测试点5)

solution 测试点5&#xff1a;总分是在每个学生加权后再取整&#xff0c;所以用来存学生分数的变量要用浮点型学校排序&#xff1a; 若成绩不同&#xff0c;则按成绩降序若成绩相同&#xff0c;人数不同&#xff0c;则按成绩升序若成绩和人数都相同&#xff0c;则按单位名升序…

理解GPT2:无监督学习的多任务语言模型

目录 一、背景与动机 二、卖点与创新 三、几个问题 四、具体是如何做的 1、更多、优质的数据&#xff0c;更大的模型 2、大数据量&#xff0c;大模型使得zero-shot成为可能 3、使用prompt做下游任务 五、一些资料 一、背景与动机 基于 Transformer 解码器的 GPT-1 证明…

NAS教程丨铁威马如何登录 SSH终端?

适用型号&#xff1a; 所有TNAS 型号 如您有特殊操作需要通过 SSH 终端登录 TNAS&#xff0c;请参照以下指引&#xff1a; (注意: 关于以下操作步骤中的"cd /"的指令,其作用是使当前 SSH/Telnet 连接的位置切换到根目录,以免造成对卷的占用.请不要遗漏它.) Windows…

数据分析的线上云端数据库搭建及Excel和Tableau连接

数据分析的线上云端数据库搭建及Excel和Tableau连接 SQL基础知识 线上SQL训练&#xff1a; SQlZOO: https://www.sqlzoo.net/wiki/SQL_Tutorial 牛客网SQL真题&#xff1a;https://www.nowcoder.com/ta/sql select,from,where, order by, limit, group by, having, substr(),…

【SpringBoot】SpringBoot使用mail实现登录邮箱验证

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 一、前期准备 1 开启邮箱服务 2 SpringBoot导入依赖 3 创建application.yml配置文件 4 创建数据库文件 5 配置redis服务 二、验证邮件发送功能 三、注册功能实现邮箱验证 1 创建User实体类 2 创建UserPa…

DEBOPIE框架:打造最好的ChatGPT交易机器人

本文介绍了如何利用 DEBOPIE 框架并基于 ChatGPT 创建高效交易机器人&#xff0c;并强调了在使用 AI 辅助交易时需要注意的限制以及操作步骤。原文: Build the Best ChatGPT Trading Bots with my “DEBOPIE” Framework 如今有大量文章介绍如何通过 ChatGPT 帮助决定如何以及在…

仓库管理系统12--供应商设置

1、添加供应商窗体 2、布局控件UI <UserControl x:Class"West.StoreMgr.View.SupplierView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc"http://…

为什么前端传了token,后端一直获取不到?一直报跨域错误?

这是我的前端代码 这是我的后端拦截器 那就需要了解一下 预检请求 对于非简单请求&#xff08;如PUT、DELETE或包含自定义HTTP头的请求&#xff09;&#xff0c;浏览器会先发送一个OPTIONS请求到目标服务器&#xff0c;询问是否允许该跨域请求。这个过程称为预检请求。 当opt…