位置: IT常识 - 正文

Vue3 + Vite + TypeScript + dataV 打造可视化大屏

编辑:rootadmin
Vue3 + Vite + TypeScript + dataV 打造可视化大屏 前言

推荐整理分享Vue3 + Vite + TypeScript + dataV 打造可视化大屏,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

网上有许多开源的可视化大屏项目,但是分析之后,还是想自己从 0 搭建一个可视化大屏项目,毕竟 Vue 一直在更新,自己搭建的可以使用最新版本的 Vue ,如果对版本没有太多要求的小伙伴们选择那些开源项目的基础上去修改也是很不错的。其次自己搭建一个项目,可以更好的了解具体的实现方式。当然这个项目中还是会引用一些组件库。

创建 Vue3 + TypeScript + Vite 项目

这里就不过多去介绍了,创建项目大家都会,我这里就使用 WebStorm 去创建一个项目,node 我选用 18.6.0版本的

项目创建好之后,我们先来引入一个组件库 DataV Vue3。这个组件库是在 DataV 的基础上重构的

引入 DataV Vue3首先为什选择 DataV Vue3 ,是因为 DataV 虽然有 Vue2,Vue3,React 各个版本的,但是 Vue3 版本的不支持 Vite其次,为什么要使用 DataV Vue3 ,是因为这里为我们封装好了一些酷炫的边框、装饰、图表之类的组件,我们可以拿过来直接使用安装npm install @kjgl77/datav-vue3全局引入(也可以按需引入,考虑到每个页面都可能会用到,所以这里直接在 main.ts 中全局引入)// main.ts中全局引入import { createApp } from 'vue'import DataVVue3 from '@kjgl77/datav-vue3'const app = createApp(App)app.use(DataVVue3)app.mount('#app')Vue3 + Vite + TypeScript + dataV 打造可视化大屏

接下来就该屏幕适配的问题了,虽然 DataV Vue3 中有全局容器 <dv-full-screen-container>,但是官方文档中建议在全屏容器内使用百分比搭配 flex 进行布局,以便于在不同的分辨率下得到较为一致的展示效果。 并且使用前请注意将 body 的 margin 设为 0 ,否则会引起计算误差,全屏后不能完全充满屏幕。我还是倾向于直接使用 px 或者 vw、vh 布局,所以打算自己去进行屏幕的适配。

屏幕适配

屏幕适配大概有这几种方式:rem、scale、vw 和 vh、以及 DataV Vue3 中的全局容器,这些方式都可以很好的去进行适配,具体选用哪种方法就看各人的喜好以及项目的需求了。个人比较推荐 scale 这种方式,所以这里就采用 scale 方式来进行屏幕适配

scale 方式实现思路

scale 方式,大家都知道就是等比例缩放。一般情况下,我们的设计稿尺寸都是 1920*1080 (具体尺寸可以提前和 UI 沟通好),我们就以这个尺寸作为我们需要保持的默认的宽高比例,然后我们使用 window.innerWidth 、 window.innerHeight 获取浏览器窗口内部的宽度和高度,之后根据浏览器窗口内部的宽高比和默认的宽高比来计算出需要缩放的比例就可以了。

代码

我们对其进行封装提取,在 utils 文件夹中新建一个 scalingRatio.ts 文件

import { ref } from 'vue'export default function useDraw() { // 指向最外层容器 const appRef = ref() // 定时函数 const timer = ref(0) // 默认缩放值 const scale = { width: '1', height: '1', } // 设计稿尺寸(px) const baseWidth = 1920 const baseHeight = 1080 // 需保持的比例 const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5)) const calcRate = () => { // 当前宽高比 const currentRate = parseFloat((window.innerWidth / window.innerHeight).toFixed(5)) if (appRef.value) { if (currentRate > baseProportion) { // 表示更宽 scale.width = ((window.innerHeight * baseProportion) / baseWidth).toFixed(5) scale.height = (window.innerHeight / baseHeight).toFixed(5) appRef.value.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)` } else { // 表示更高 scale.height = ((window.innerWidth / baseProportion) / baseHeight).toFixed(5) scale.width = (window.innerWidth / baseWidth).toFixed(5) appRef.value.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)` } } } const resize = () => { clearTimeout(timer.value) timer.value = setTimeout(() => { calcRate() }, 200) } // 改变窗口大小重新绘制 const windowDraw = () => { window.addEventListener('resize', resize) } // 改变窗口大小重新绘制 const unWindowDraw = () => { window.removeEventListener('resize', resize) } return { appRef, calcRate, windowDraw, unWindowDraw }}

接下来就是 CSS 部分以及使用封装的方法来进行屏幕适配,这里需要把宽高改为你自己的设计稿的宽高

<!--app.vue--><script setup lang="ts">import { RouterView } from 'vue-router'</script><template> <div class="app"> <RouterView /> </div></template><style lang="scss" scoped>.app { width: 100vw; height: 100vh; background-color: #000; overflow: hidden;}</style><!--index.vue--><script lang="ts" setup>import { onMounted, onUnmounted,} from 'vue'// 引入封装好的方法import useDraw from '@/utils/useDraw'// 适配处理const { appRef, calcRate, windowDraw, unWindowDraw } = useDraw()// 生命周期onMounted(() => { windowDraw() calcRate()})onUnmounted(() => { unWindowDraw()})</script><div id="index" ref="appRef"> <!-- 页面内容--></div><style>#index{ color: #d3d6dd; /*根据设计稿的宽高进行修改*/ width: 1920px; height: 1080px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); transform-origin: left top;}</style>图表组件安装 eChartsnpm i echarts --save全局引入以及挂载// main.tsimport { createApp } from 'vue'import App from './App.vue'import router from './router'import DataVVue3 from '@kjgl77/datav-vue3'// 引入全局样式import './assets/scss/style.scss';// 引入 eChartsimport * as echarts from 'echarts'const app = createApp(App)/** 全局挂载 eCharts* 这里需要注意的是,挂载之前不能连缀 use()和 mount(),也就是挂载要写到 use() 之前* */app.config.globalProperties.$echarts = echartsapp.use(DataVVue3)app.use(router)app.mount('#app')使用

因为 Vue3 是组合 API ,所以要引入对应的 getCurrentInstance 去使用挂载到全局的图表组件

<script lang="ts" setup>import { onMounted, ref, getCurrentInstance} from 'vue'const { proxy }: any = getCurrentInstance()const decorationColors = ['#568aea', '#000000']const title = '可视化大屏项目示例'const eacharts1 = ref(null)const renderChart = () => { var myChart = proxy.$echarts.init(eacharts1.value); myChart.setOption({ title: [ { text: '极坐标柱状图标签' } ], polar: { radius: [30, '80%'] }, radiusAxis: { max: 4 }, angleAxis: { type: 'category', data: ['a', 'b', 'c', 'd'], startAngle: 75 }, tooltip: {}, series: { type: 'bar', data: [2, 1.2, 2.4, 3.6], coordinateSystem: 'polar', label: { show: true, position: 'middle', formatter: '{b}: {c}' } }, animation: false })};onMounted(() => { renderChart()})</script><template> <div class="eacharts1" ref="eacharts1" style="width: 500px;height: 500px;"></div></template>

到这里,所需的东西基本就都 OK 了,我们就可以开始我们的大屏项目布局以及后续开发了。这里的屏幕适配的实现方式参考了 vue-big-screen 的实现方式。如果不使用 vite ,也可以直接使用 vue-big-screen 提供的源码进行删减,然后开发使用。 此 Demo 已上传至个人 GitHub ,需要的可自取。更多文章(由于只是 Demo ,所以在样式方面并没有过多的去调整)

本文链接地址:https://www.jiuchutong.com/zhishi/287234.html 转载请保留说明!

上一篇:关于【Stable-Diffusion WEBUI】方方面面研究(内容索引)(以下关于static)

下一篇:【Vue】跳转外部链接并携带参数并触发(vue跳转到外部链接且带上参数)

  • 华为水印相机怎么设置定位和时间(华为水印相机怎么弄)

    华为水印相机怎么设置定位和时间(华为水印相机怎么弄)

  • mac打印快捷键(macbookair打印快捷键)

    mac打印快捷键(macbookair打印快捷键)

  • oppo如何使用小爱同学(OPPO如何使用小布)

    oppo如何使用小爱同学(OPPO如何使用小布)

  • SimAPPDialog可以卸载吗(sim卡app怎么删除)

    SimAPPDialog可以卸载吗(sim卡app怎么删除)

  • 电脑有没有后置摄像头(电脑有后摄像头吗)

    电脑有没有后置摄像头(电脑有后摄像头吗)

  • 小红书怎么隐藏自己的点赞(小红书怎么隐藏ip地址)

    小红书怎么隐藏自己的点赞(小红书怎么隐藏ip地址)

  • 淘宝极速版和淘宝有什么区别(淘宝极速版与淘宝有什么区别)

    淘宝极速版和淘宝有什么区别(淘宝极速版与淘宝有什么区别)

  • 发起群聊不说话删除退出别人知道吗(发起群聊不说话然后移除群成员)

    发起群聊不说话删除退出别人知道吗(发起群聊不说话然后移除群成员)

  • ipad air4什么时候出的(ipad air4什么时候支持台前调度)

    ipad air4什么时候出的(ipad air4什么时候支持台前调度)

  • 路由器wps要不要开

    路由器wps要不要开

  • 微信群举报多少次会封禁(微信群举报多少次才封)

    微信群举报多少次会封禁(微信群举报多少次才封)

  • iphone下面的横条没了(iphone下面的横条怎么变浅)

    iphone下面的横条没了(iphone下面的横条怎么变浅)

  • 快手如何关注2000人(快手如何关注别人账号)

    快手如何关注2000人(快手如何关注别人账号)

  • 9700kf和9700f的区别(9700kf和9700k)

    9700kf和9700f的区别(9700kf和9700k)

  • 小米快速同步模式是什么(小米同步怎么开)

    小米快速同步模式是什么(小米同步怎么开)

  • 路由器上1234什么意思(路由器上1234灯是干嘛的)

    路由器上1234什么意思(路由器上1234灯是干嘛的)

  • 抖音评论怎么发gif(抖音评论怎么发语音消息)

    抖音评论怎么发gif(抖音评论怎么发语音消息)

  • 微信标签怎么删除(微信标签怎么删除里面的人)

    微信标签怎么删除(微信标签怎么删除里面的人)

  • 移液枪的正确使用方法(移液枪的正确使用方法一档二档)

    移液枪的正确使用方法(移液枪的正确使用方法一档二档)

  • 华为aum-al20是什么型号(华为alm al20是什么型号)

    华为aum-al20是什么型号(华为alm al20是什么型号)

  • iphonexsmax有nfc功能么(iphonexsmax nfc怎么用)

    iphonexsmax有nfc功能么(iphonexsmax nfc怎么用)

  • soul上怎么搜认识的人(soul怎么搜索好友)

    soul上怎么搜认识的人(soul怎么搜索好友)

  • 华为p10热点为何共享不了(华为热点为什么不可上网)

    华为p10热点为何共享不了(华为热点为什么不可上网)

  • 酷我音乐如何切换账号(酷我音乐如何切换第三方账号)

    酷我音乐如何切换账号(酷我音乐如何切换第三方账号)

  • 安装了搜狗输入法切不出来(安装了搜狗输入法打不出汉字)

    安装了搜狗输入法切不出来(安装了搜狗输入法打不出汉字)

  • Pytorch复习笔记--导出Onnx模型为动态输入和静态输入(pytorch基础教程)

    Pytorch复习笔记--导出Onnx模型为动态输入和静态输入(pytorch基础教程)

  • vue3+ts深入组件(一)Props(深入vue3+typescript技术栈)

    vue3+ts深入组件(一)Props(深入vue3+typescript技术栈)

  • 工资超5000已申报税额为0,可以退税吗
  • 全国税务师考试准考证打印
  • 甲企业持有乙企业的非上市股票2000股
  • 印花税滞纳金怎么算
  • 建筑公司核定征收是什么意思
  • 小规模纳税人和个体工商户的税收政策
  • 申报怎么打印
  • 出口报关金额要考虑银行手续费吗
  • 公司报销专用发票
  • 违约金 罚款
  • 民事诉讼的适用范围和基本制度
  • 个体户发放现金工资税务局认可吗
  • 一般纳税人开技术服务费
  • 酒类消费税征收环节归纳
  • 建筑企业增值税预缴
  • 营改增的优惠政策
  • 减税降费新政策解读
  • 基金会可以投资企业吗
  • 营业外支出调减应该填在纳税调整项目明细表哪一项
  • 设计费计入成本
  • 2019新版利润表填表说明
  • 税务机关代码不能为空怎么解决
  • 询证函是什么文书
  • 个体工商户是小微吗
  • 查账补缴的税的账怎么做
  • php怎么输出汉字
  • 天猫的软件服务费指的是什么
  • 上月抵扣的发票怎么开
  • 应发工资扣税
  • 长期债券投资业务处理
  • 现金支付医保报销
  • 累积未分配利润为负可以分红吗
  • 结转本月完工产品成本120000元
  • bootstrapicon
  • 什么是微前端
  • 餐饮固定成本怎么算的
  • 酒店的销售费用和管理费用如何进行区分
  • 定额发票和增值税发票
  • 非营利组织能否开社保账户
  • python3多态
  • 工程主营业务收入
  • 税务异常怎么处理要多长时间
  • 电子发票自己打印黑白有效吗
  • 个人名字的发票可以报销吗
  • 应付职工薪酬的核算内容
  • 小规模纳税人是什么意思
  • 固定资产计提折旧的原则
  • 金税盘锁死341101
  • 房屋出租简易计税进项税额需要转出么
  • 报销差旅费如何做记账凭证
  • 出纳去银行取钱需要带什么
  • 当月的银行日记账漏计怎么办
  • 土地出让过程缴纳的费用
  • 印花税是根据什么计算的
  • 交易性金融资产公允价值变动计入
  • 纳税人可以委托税务人员办理纳税申报吗
  • 公益救济性捐赠应计入的会计科目是
  • SQLServer CONVERT 函数测试结果
  • centos chrony
  • winxp系统用户不见了
  • win7远程设置在哪
  • linux怎么管理进程
  • win7开机进入桌面黑屏但有鼠标
  • win10无法收到wifi
  • 动态添加echarts
  • 用kotlin开发android
  • nodejs异步处理执行顺序
  • 幼儿园放鞭炮
  • android学习路线
  • linux -lc
  • 批处理转义字符如何
  • javascript怎么用
  • js设置延时执行
  • python基础教程视频教程
  • unity she
  • js轮播图视频教程
  • flash谈广告
  • Jquery $when done then的用法详解
  • 财税公司销售工作好做么
  • 租赁费的税率是多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设