canvas绘制表格

news2025/1/10 20:21:29

canvas绘制表格

最近在为公司产品做技术预研,经理让用canvas做一个表格,于是就有了这篇博客。

我们的数据是后端通过MQTT推送过来的
我在代码中也直接使用了
具体MQTT的实现代码,可见博客
在vue使用MQTT

在这里为了方便实用我直接封装成组件了,当MQTT数据来了就出发绘制方法

<template>  
  <div>  
    <!-- 画布元素,用于绘图 -->  
    <canvas ref="canvasRef" height="180" width="600"></canvas>  
  </div>  
</template>  
  
<script setup>  
import {defineExpose, onMounted, ref} from 'vue';  
import UseMqtt from "../hooks/useMqtt.js"; // 引入MQTT通信的自定义hook  
  
// 画布引用  
const canvasRef = ref(null);  
// 画布上下文  
const ctx = ref(null);  
// 存储接收到的数据  
const data = ref([]);  
// 行高  
const rowHeight = 30;  
// 当前偏移量,用于控制画布滚动  
const currentOffset = ref(30);  
  
// 数据格式示例  
/*[{  
  "hx": 56,  
  "szy": 77,  
  "xl": 74,  
  "ssy": 122,  
  "xybhd": 0.36  
}]*/  
  
/**  
 * 绘制函数,用于在画布上绘制表格  
 */  
const drawTable = () => {  
  const canvas = canvasRef.value;  
  ctx.value = canvas.getContext('2d');  
  ctx.value.clearRect(0, 0, canvas.width, canvas.height); // 清除画布  
  ctx.value.fillStyle = 'black'; // 设置填充颜色  
  ctx.value.font = '16px Arial'; // 设置字体  
  // 绘制列标题  
  const headers = ["hx", "szy", "xl", "ssy", "xybhd"];  
  headers.forEach((header, index) => {  
    ctx.value.fillText(header, index * 120, rowHeight);  
  });  
  
  // 绘制数据行  
  data.value.forEach((item, rowIndex) => {  
    const y = (rowIndex + 1) * rowHeight + currentOffset.value;  
    if (y < canvas.height) {  
      Object.values(item).forEach((value, colIndex) => {  
        ctx.value.fillText(value, colIndex * 120, y);  
      });  
    }  
  });  
};  
  
onMounted(() => {  
  drawTable(); // 组件挂载后绘制表格  
});  
  
const options = {  
  subscription: {topic: "/testtopic/yq", qos: 0} // MQTT订阅配置  
}  
const {  
  createAndDo,  
  destroyConnection  
} = UseMqtt(options, getMessage); // 使用MQTT hook,并传入消息处理函数  
  
/**  
 * 接收消息  
 * @param v 接收到的消息  
 */  
function getMessage(v) {  
  try {  
    data.value.push(JSON.parse(v)) // 解析并存储消息  
    if (data.value.length >= 5) {  
      data.value.shift() // 如果数据超过5条,移除最旧的一条  
    }  
    drawTable(); // 重新绘制表格  
  } catch (e) {  
    console.error(e) // 错误处理  
  }  
}  
  
onMounted(() => {  
  createAndDo() // 组件挂载后建立MQTT连接并开始接收消息  
})  
  
defineExpose({  
  destroyConnection, // 暴露销毁MQTT连接的方法  
  createAndDo // 暴露建立并开始MQTT连接的方法  
})  
</script>

效果图

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

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

相关文章

【中项第三版】系统集成项目管理工程师 | 第 11 章 规划过程组⑥ | 11.15 - 11.17

前言 第11章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于10大管理的内容&#xff0c;学习要以教材为准。本章上午题分值预计在15分。 目录 11.15 规划资源管理 11.15.1 主要输入 11.15.2 主要工具与技术 11.15.3 主要输出 11.16 估算活动资源 11.1…

安装jdk和tomcat

安装nodejs 1.安装nodejs&#xff0c;这是一个jdk一样的软件运行环境 yum -y list installed|grep epel yum -y install nodejs node -v 2.下载对应的nodejs软件npm yum -y install npm npm -v npm set config .....淘宝镜像 3.安装vue/cli command line interface 命令行接…

轻松搞定 Nginx 在 CentOS 和 Ubuntu 上的安装与配置

注&#xff1a;这是对我以前博客进行优化后再次发布的&#xff0c;博客中的截图为以前的。原博客已删除。 如何安装nginx nginx是一款开源、高性能的Web和反向代理服务器&#xff0c;支持HTTP、HTTPS、SMTP、POP3和IMAP协议。由于其轻量级、资源占用少和强大的并发能力&#…

时空预测又爆火了!新SOTA实现零样本精准预测

时空预测又有新突破啦&#xff01;港大、华南理工等提出了时空大模型UrbanGPT&#xff0c;在性能上猛超现有SOTA&#xff0c;实现零样本即可时空预测&#xff01; 另外还有清华的首个通用城市时空预测模型UniST、能即插即用快速适配的时空提示调整机制FlashST...这些效果非常ni…

探索计算器存储器的奥秘:数字记忆的科学

在日常生活中&#xff0c;我们经常使用计算器来执行各种数学运算。但你是否曾想过&#xff0c;当按下每个按键时&#xff0c;计算器是如何记住数字和运算符的&#xff1f;本文将深入探讨计算器存储器的工作原理&#xff0c;揭示其背后的科学原理。 引言&#xff1a;数字世界的…

家庭出游新风尚!格瑞维亚改装大赛创意实用并存

在创新浪潮翻涌的当下&#xff0c;汽车已蜕变为个性化生活的璀璨舞台&#xff0c;格瑞维亚改装共创大赛便是这一变革的推动者。这场大赛&#xff0c;不仅汇聚了400余支创意团队的心血结晶&#xff0c;更将汽车改装的魅力推向了新的高度。它不仅仅是对机械与美学的重塑&#xff…

STM32——EXIT外部中断

一、中断系统 以上就是中断的概念&#xff0c;简单理解就是&#xff1a; 当程序运行过程中&#xff0c;如果有中断源向CPU打报告&#xff0c;CPU就会暂停手下的事情去处理中断源提交的事情&#xff0c;然后处理完了在返回到CPU原来的位置继续处理手上的事情。如果同时有多个中…

浏览器指纹技术:如何更改浏览器指纹?

“指纹信息”是一个人独有的身份象征&#xff0c;而“浏览器指纹”&#xff0c;就是网站和在线平台使用浏览器指纹来收集有关您的浏览器、设备和网络的详细信息&#xff0c;它可以说是你上网的身份象征&#xff0c;可让网站跟踪您的在线行为。 下面我们简单科普浏览器指纹的工…

tomato 靶场

1.主机发现 扫描ip及端口 2.端口扫描 nmap192.168.233.131 有三个开放的端口nmap -sC -sV -O 192.168.233.131 -sC常见漏洞脚本扫描 -sV开放端口服务/版本号 -O操作系统探测 3.目录扫描 DIRECTORY: http://192.168.233.131/antibot_image/ http://192.168.233.131/index.h…

单调队列与单调栈<1>——单调队列

单调队列&#xff0c;即队列里的元素单调递增或递减。一般用于求区间内的最值问题。 模板题:P1886 暴力的话很简单&#xff0c;搞定。但是对于来说肯定TLE。所以我们要用单调队列来解决这道题。因为单调队列中元素大小单调递增或递减&#xff0c;所以&#xff0c;队首必定是最…

TwinCAT3 新建项目教程

文章目录 打开TwinCAT 新建项目&#xff08;通过TcXaeShell&#xff09; 新建项目&#xff08;通过VS 2019&#xff09;

案例精选 | 聚铭网络助力石家庄市栾城区中医院防护体系焕新升级

石家庄市栾城区中医院&#xff0c;坐落于栾城这块历史悠久的热土上&#xff0c;占地广阔&#xff0c;达4200平方米&#xff0c;作为一家享有盛誉的二级甲等综合性中医医疗机构&#xff0c;它不仅是传统医学与现代科技融合的典范&#xff0c;更是区域医疗卫生服务的重要支柱。 …

【JavaScript】详解数组方法 fill()

文章目录 一、fill()方法简介二、fill()方法的基本用法三、fill()方法的进阶用法四、实际应用案例五、注意事项六、总结 在JavaScript中&#xff0c;fill()方法是数组操作中一个非常有用的方法。它可以快速地用特定值填充数组的全部或部分内容。理解fill()方法的工作机制和使用…

深度对话安天王小丰:我们应该从微软“蓝屏”事件学到什么?

ITValue 国内厂商和CrowdStrike的差距&#xff0c;相比于国外厂商和CrowdStrike的差距更大。 作者&#xff5c;张帅 编辑&#xff5c;盖虹达 首发&#xff5c;钛媒体APP ITValue 我们赖以生存的数字世界&#xff0c;可能比想象得还要脆弱。 近日&#xff0c;全球范围内的微软Wi…

基于Gitlab CI+Argo CD的Gitops实践

项目简介 项目说明 本项目构建了一个基于GitOps理念的完整CI/CD管道&#xff0c;旨在实现软件开发与运维的高度自动化和一致性。通过GitLab、GitLab Runner&#xff08;部署于Kubernetes&#xff09;、Maven、Java、SonarQube、Harbor以及Argo CD等工具的紧密协作&#xff0c…

二叉树的存储

二叉树的存储 满二叉树或者完全二叉树可以采用顺序存储&#xff0c;普通二叉树一般采用链式存储 节点的结构体原型 typedef int DataType typedef struct node { DataType data&#xff1b; struct node *L&#xff1b; struct node *R&#xff1b; }twotree&#xff…

【数值计算方法】数值积分微分-python实现-p3

原文链接&#xff1a;https://www.cnblogs.com/aksoam/p/18332123 更多精彩&#xff0c;关注博客园主页&#xff0c;不断学习&#xff01;不断进步&#xff01; 我的主页 csdn很少看私信&#xff0c;有事请b站私信 博客园主页-发文字笔记-常用 有限元鹰的主页 内容&#xf…

【阅读笔记】红外sensor的ITR、IWR读出模式分析

一、ITR、IWR读出模式分析 InGaAs短波红外探测器具有ITR和IWR两种工作模式。两种工作模式都包括三个相同的工作过程&#xff0c;即复位、积分和读出。每个工作过程的开始与结束都由配置指令码控制&#xff0c;配置指令码包括复位指令、开始积分指令、开始读出指令和读出结束指…

找到学习的引擎,更让你进入心流状态的高效学习

一、心流状态的启动秘籍 1. 简单开始&#xff1a;找到学习的入口 从简单的任务开始&#xff0c;比如整理学习空间或列出学习计划&#xff0c;让大脑逐渐适应学习的节奏。 2. 环境塑造&#xff1a;打造专注的学习空间 清理桌面&#xff0c;减少干扰&#xff0c;比如将手机置…