# 2210
**Repository Path**: china__zzm/2210
## Basic Information
- **Project Name**: 2210
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-05-21
- **Last Updated**: 2025-06-07
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Vue 3 + Vite
## vue 生命周期中都干了些什么事
- beforeCreate(创建前):数据观测和初始化事件还未开始,此时 data 的响应式追踪、event/watcher 都还没有被设置,也就是说不能访问到 data、computed、watch、methods 上的方法和数据。
- created(创建后) :实例创建完成,实例上配置的 options 包括 data、computed、watch、methods 等都配置完成,但是此时渲染得节点还未挂载到 DOM,所以不能访问到 $el 属性。
- beforeMount【onBeforeMount(vue3)】(挂载前):在挂载开始之前被调用,相关的 render 函数首次被调用。实例已完成以下的配置:编译模板,把 data 里面的数据和模板生成 html。此时还没有挂载 html 到页面上。
- mounted[onMounted(vue3)](挂载后):在 el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用。实例已完成以下的配置:用上面编译好的 html 内容替换 el 属性指向的 DOM 对象。完成模板中的 html 渲染到 html 页面中。此过程中进行 ajax 交互。
- beforeUpdate【onBeforeUpdate(vue3)】(更新前):响应式数据更新时调用,此时虽然响应式数据更新了,但是对应的真实 DOM 还没有被渲染。
- updated【onUpdated(vue3)】(更新后) :在由于数据更改导致的虚拟 DOM 重新渲染和打补丁之后调用。此时 DOM 已经根据响应式数据的变化更新了。调用时,组件 DOM 已经更新,所以可以执行依赖于 DOM 的操作。然而在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务器端渲染期间不被调用。
- beforeDestroy【onBeforeUnmount(vue3)】(销毁前):实例销毁之前调用。这一步,实例仍然完全可用,this 仍能获取到实例。
- destroyed【onUnmounted(vue3)】(销毁后):实例销毁后调用,调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务端渲染期间不被调用。
# vue-router 配置流程
## 1.安装 vue-router
执行命令
```
pnpm i vue-router
```
## 2.在 src 下面创建 router 文件夹 文件夹下 创建 index.js 文件内容 见官网 "入门" 代码如下
```
import { createWebHashHistory, createRouter } from 'vue-router'
import HomeView from '../view/Home/index.vue'
const routes = [
{ path: '/', component: HomeView },
{ path: '/about', component: () => import("../view/About/index.vue") },
]
const router = createRouter({
history: createWebHashHistory(),
routes,
})
export default router
```
- 注意:需要确保组件存在 比如 view 下面是否存在 home 和 about 组件 注意需要将 router 进行抛出
- 官网默认的路由模式 是 memery 我们使用的是 hash
## 3.main.js 配置
需要引入 代码如下
```
import router from './router/index.js'
app.use(router)
```
## 4.配置 app.vue 文件 使其支持页面跳转 代码如下
```
```
# pinia 安装和使用 官网地址 https://pinia.web3doc.top/getting-started.html
## 1.安装 pinia
```
pnpm i pinia
```
## 2.创建 store/index.js 文件 【默认的测试文件 不要也可以】 内容如下
```
// 注意引入 defineStore 官网上是没有些引入的
import { defineStore } from "pinia"
export const useIndex = defineStore('index', {
state: () => ({
counter: 0,
}),
actions: {
increment() {
this.counter++
},
randomizeCounter() {
this.counter = Math.round(100 * Math.random())
},
},
})
```
## 3.main.js 配置
```
import { createPinia } from 'pinia'
app.use(createPinia())
```
## 4.vue 页面测试使用 示例如下
```
home
{{ indexStore.counter }}
```
# 配置@ 符号路径代理/别名
## 1.安装 path
```
pnpm i path
```
## 2.配置 vite。config.js 文件内容如下
```
// const path = require('path')
import path from 'path'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vite.dev/config/
export default defineConfig({
plugins: [vue()],
resolve:{
alias:{
'@': path.resolve(__dirname, 'src'),
}
}
})
```
# Vue3 中按照 1920\*1080 分辨率计算 rem 并设置根节点字体大小
## 在 Vue3 项目中,要实现基于 1920\*1080 分辨率的 rem 适配方案,可以通过以下步骤实现:
### 方案一:通过 JavaScript 动态计算
在项目的 public/index.html 或 main.js 中添加以下代码:
```
javascript
// 按设计稿宽度 1920px 计算,1rem = 设计稿宽度 / 19.2
function setRem() {
const baseSize = 1920 / 19.2; // 1rem = 100px (1920/19.2=100)
const scale = document.documentElement.clientWidth / 1920;
document.documentElement.style.fontSize = baseSize * Math.min(scale, 2) + 'px';
}
// 初始化
setRem();
// 窗口大小变化时重置 rem
window.addEventListener('resize', setRem);
```
### 方案二:使用 postcss-pxtorem 插件
首先安装 postcss-pxtorem 插件:
```
bash
npm install postcss-pxtorem -D
在项目根目录创建或修改 postcss.config.js:
javascript
export default{
plugins: {
'postcss-pxtorem': {
rootValue: 100, // 1rem = 100px (1920/19.2)
propList: ['*'],
selectorBlackList: [],
minPixelValue: 2
}
}
}
```
同样需要在入口文件添加动态计算 rem 的代码(同方案一)
### 方案三:使用 lib-flexible + postcss-pxtorem(推荐)
安装依赖:
```
npm install amfe-flexible postcss-pxtorem -D
在 main.js 中引入:
javascript
import 'amfe-flexible';
修改 postcss.config.js:
javascript
export default {
plugins: {
'postcss-pxtorem': {
rootValue: 192, // 1920/10
propList: ['*'],
// 忽略转换正则匹配项
selectorBlackList: ['.norem']
}
}
}
```
使用说明
在 CSS 中直接按照设计稿的像素值书写即可,例如设计稿上是 20px,就写 20px,插件会自动转换为 rem
对于不想转换的样式,可以使用大写 PX 或添加特定类名排除
注意事项
此方案基于宽度适配,高度可能需要额外处理
对于非常小的屏幕(如移动端),可能需要设置最大缩放比例
在开发时,可以直接按照 1920px 设计稿的尺寸写 px 单位
以上方案可以根据项目需求选择使用,方案三是最为成熟和推荐的解决方案。
# js 的深浅拷贝
## 深拷贝 即赋值了指针 又复制了值
比如基本数据类型 字符串 数值 Boolean 。。 存在占内存
eg:
let a = 1
let b = a
a=2
console.log(b)//1
//变量分配过程 在栈内存中 设置 一个值 1 在设置一个 指针 在定义一个变量 a
## 浅拷贝(只赋值了指针 或者 只复制了 栈内存里面的东西)
复杂数据类型 的值是存在堆内存 指针和变量存栈内存
let obj = {age:20}
let obj1 = obj
obj.age=21
console.log(obj.age) //21
数据类型 es6 symbol bigint 基本数据类型
复杂 对象 数组 函数
特殊数据类型 new Date() 时间类型 正则 blob
let obj = {age:20,arr:{name:"张三"}}
let obj1 = {...obj}
obj.age =21
obj.arr.name = "李四"
console.log(obj1)
let obj2 = {age:20,time:new Date()}
JSON.stringify
JSON.pase
当他遇到特殊的数据类型的时候不能创建值
# 大屏项目开发
## 项目详解
### 技术栈: vue3 vite element-plus echarts threejs sse axios vue-router pinia postcss
### 技术点
#### 适配解决方案
主要利用了 postcss 按照 1920\*1080 的分辨率 进行 rem 的重新计算,我们配置的是 将 px 单位重新覆盖 如果使用大写的 PX 还保留之前的像素值 小写的 px 等同于 rem 同时 最外层也利用了 vw vh 控制整个盒子的宽高,里面大量应用了 flex 布局
#### 请求
- 对 axios 进行了二次封装 主要设置了 请求拦截器和响应拦截器 ,响应拦截器中做了统一数据返回。
- SSE 因为有设备数据实时展示,所以应用了 sse 进行实时数据推送(单项推送,不支持客户端像服务端推送,只能服务端向客户端推送,如果客户端需要和服务端进行交互的话 直接通过 axios 调接口即可)
#### 虚拟列表
该项目因为有长列表的渲染,因此需要虚拟列表技术对项目进行优化,主要原理 保障 dom 渲染数量可控,不会因为数据的数量改变 dom 的数量。特点 大数据下列表展示不会产生卡顿。
代码原理:
获取显示容器高度,获取每条数据显示高度
容器高度/单条高度 = 容器数据显示数量
单条高度 \* 总数据条数 = 容器虚拟高度 (用于展示滚动条,计算偏移量)
监听滚动事件 计算偏移量 从总数据中截取响应的数据进行展示
#### Echarts 组件封装
echarts 的使用流程
第一步 初始化 init 第二部 setoption 第三步 放到 dom 中去 第四步 监听 resize 适配浏览器窗口变化
第五部 销毁的生命周期中 去掉 resize 的监听 以及 调用 echarts 的 clear 方法 释放内存
在这个组件中 需要 2 个参数 一个是 option 另外一个是 autopaly 通过 watch 监听 option 的数据变化 进行 图表的数据渲染,同时通过 autoplay 属性 控制是否默认开启自动切换动画 (通过 echarts 的 dispatchAction 方法 设置 列的高亮和显示提示框 动画效果 true 的话 就会开启定时器)销毁的生命周期中 也会将这个定时器进行销毁
#### Select 组件封装
##### 组件接收三个主要属性:
modelValue:用于 v-model 双向绑定
options:选项列表,格式为 [{value: '值', label: '标签'}]
placeholder:占位符文本,默认为"请选择"
##### 组件触发两个事件:
update:modelValue:更新选中值
change:选项变更时触发
##### 样式特点:
使用自定义背景图片
支持选项悬停和选中效果
下拉箭头有旋转动画
选项列表有最大高度限制,超出时可滚动
##### 实现效果:
这是一个自定义的下拉选择框组件,具有以下特点:
支持自定义背景图片
支持自定义选项列表
支持双向绑定(v-model)
具有下拉展开/收起动画效果
支持选中项高亮显示
支持自定义占位符文本
##### 核心功能:
通过 props 接收外部传入的数据(选项列表、当前值、占位符)
使用 ref 管理下拉框的开关状态
使用 computed 计算当前选中项的标签文本
通过 emit 向父组件发送值更新和选择变更事件
#### 容器类组件封装 主要利用 父子组件传值 和 默认插槽 具名插槽等技术实现
#### echarts 的 地图下钻
技术栈:
使用 Vue 3 的 Composition API(