当前位置: 首页 > news >正文

React+TS前台项目实战(二十四)-- 全局常用绘制组件Qrcode封装

文章目录

  • 前言
  • Qrcode组件
    • 1. 功能分析
    • 2. 代码+详细注释
    • 3. 使用方式
    • 4. 效果展示(pc端 / 移动端)
  • 总结


前言

今天要封装的Qrcode 组件,是通过传入的信息,绘制在二维码上,可用于很多场景,如区块链项目中的区块显示交易地址时就可以用到。

Qrcode组件

1. 功能分析

(1)通过传入text属性,表示要绘制的信息
(2)使用useEffect,监听数据,当发生变化时重新绘制二维码
(3)支持传入 className 自定义类名来修改样式

2. 代码+详细注释

// @/components/Qrcode/index.tsx
import { useEffect, useRef, FC } from "react";
import QRCode from "qrcode";
import { ReactComponent as QrCodeIcon } from "./assets/qrcode.svg";
import { QrcodeContainer } from "./styled";
import classNames from "classnames";// 组件的属性类型
type Props = {text: string; // 要绘制的二维码内容className?: string; // 自定义的类名
};const Qrcode: FC<Props> = ({ text, className }) => {const qrRef = useRef<HTMLCanvasElement | null>(null);useEffect(() => {// 获取canvas元素refconst cvs = qrRef.current;// 如果没有 canvas 元素的引用,则直接返回if (!cvs) return;// 调用 QRCode.toCanvas 方法,将text绘制到canvas上QRCode.toCanvas(cvs,text,{margin: 5, // 设置二维码周围的边距errorCorrectionLevel: "H", // 设置二维码的容错级别width: 144, // 设置二维码的宽度},(err) => {if (err) {console.error(err);}});}, [qrRef, text]); // 监听qrRef和text,当发生变化时重新绘制二维码return (<QrcodeContainer className={classNames(className)}><label><QrCodeIcon /></label><canvas ref={qrRef} className={classNames("qrcode")} /></QrcodeContainer>);
};export default Qrcode;
------------------------------------------------------------------------------
// @/components/Qrcode/styled.tsx
import styled from "styled-components";
import variables from "@/styles/variables.module.scss";
export const QrcodeContainer = styled.div`width: 100%;position: relative;cursor: pointer;label {display: flex;align-items: center;cursor: pointer;}.qrcode {top: calc(100% + 10px);box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);}&::after {top: calc(100% - 15px);content: "";width: 5px;height: 5px;border: 10px solid transparent;border-bottom: 10px solid #fff;filter: drop-shadow(0 -5px 5px rgb(0, 0, 0, 0.1));}.qrcode,&::after {display: none;position: absolute;left: 50%;transform: translateX(-50%);}&:hover,&:focus-within {.qrcode,&::after {display: block;}}@media (max-width: ${variables.mobileBreakPoint}) {.qrcode,&::after {left: 0;}}
`;

3. 使用方式

// 引入组件
import Qrcode from "@/components/Qrcode";
// 使用
const address = "http://test-address?block=XXXX"
<Qrcode text={ address } />

4. 效果展示(pc端 / 移动端)

在这里插入图片描述
在这里插入图片描述


总结

下一篇讲【全局常用组件Echarts封装】。关注本栏目,将实时更新。

相关文章:

React+TS前台项目实战(二十四)-- 全局常用绘制组件Qrcode封装

文章目录 前言Qrcode组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示(pc端 / 移动端) 总结 前言 今天要封装的Qrcode 组件&#xff0c;是通过传入的信息&#xff0c;绘制在二维码上&#xff0c;可用于很多场景&#xff0c;如区块链项目中的区块显示交易地址时就可以用到…...

寄5公斤哪个快递便宜?寄10多斤的物品怎么寄最划算?

作为一个频繁需要寄东西的大学生&#xff0c;每次选择快递公司都是一件头疼的事。尤其是寄5公斤左右的包裹&#xff0c;既要考虑价格&#xff0c;又要看服务质量。今天&#xff0c;我就来分享一些寄5公斤包裹省钱的干货&#xff0c;希望能帮到大家。云木寄快递首先要推荐的就是…...

【postgresql】索引

见的索引类型&#xff1a; B-tree 索引&#xff1a;这是最常用的索引类型&#xff0c;适用于大多数查询。B-tree索引可以高效地处理范围查询。 Hash 索引&#xff1a;适用于等值查询&#xff0c;但不支持范围查询。 GiST 索引&#xff1a;通用搜索树&#xff08;GiST&#xf…...

2D Game Kit在unity的使用

本文参考&#xff1a; 如何制作游戏&#xff1f;【不需要编程 __】新手30分钟 学会制作2D游戏&#xff01;_ 如何制作游戏 _ unity教学 _ 制作游戏 _ 2d游戏_哔哩哔哩_bilibili 1、下载2d game kit 新建一个unity工程&#xff0c;进入该工程后&#xff0c;在Window -> Ass…...

使用中国大陆镜像源安装最新版的 docker Deamon

在一个智算项目交付过程中&#xff0c;出现了新建集群中的全部 docker server V19 进程消失、仅剩 docker server 的 unix-socket 存活的现象。 为了验证是否是BD产品研发提供的产品deploy语句缺陷&#xff0c;需要在本地环境上部署一个简单的 docker Deamon 环境。尴尬的是&a…...

机器学习原理之 -- 支持向量机分类:由来及原理详解

支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是统计学习理论的一个重要成果&#xff0c;广泛应用于分类和回归问题。SVM以其高效的分类性能和良好的泛化能力在机器学习领域中占据重要地位。本文将详细介绍支持向量机的由来、基本原理、构建过程及其优缺点。…...

华为机试HJ8合并表记录

华为机试HJ8合并表记录 题目&#xff1a; 数据表记录包含表索引index和数值value&#xff08;int范围的正整数&#xff09;&#xff0c;请对表索引相同的记录进行合并&#xff0c;即将相同索引的数值进行求和运算&#xff0c;输出按照index值升序进行输出。 想法&#xff1a…...

Leetcode 2043简易银行交易系统

题目描述 简易银行系统 尝试过 中等 相关标签 相关企业 提示 你的任务是为一个很受欢迎的银行设计一款程序&#xff0c;以自动化执行所有传入的交易&#xff08;转账&#xff0c;存款和取款&#xff09;。银行共有 n 个账户&#xff0c;编号从 1 到 n 。每个账号的初始余额存储…...

适合职场小白的待办事项管理方法和工具

刚入职场那会儿&#xff0c;我每天都像只无头苍蝇&#xff0c;忙得团团转却效率低下。待办事项像潮水般涌来&#xff0c;会议、报告、客户跟进……每一项都像是悬在头顶的利剑&#xff0c;让我焦虑不堪。我深知&#xff0c;管理好待办事项是职场生存的必修课&#xff0c;但该如…...

相机参数与图像处理技术解析

01. 相机内参和外参的含义&#xff1f;如果将图像放大两倍&#xff0c;内外参如何变化&#xff1f; 相机有两个最基础的数据&#xff1a;内参(Instrinsics)和外参(Extrinsics)&#xff0c;内参主要描述的是相机的CCD/CMOS感光片尺寸/分辨率以及光学镜头的系数&#xff0c;外参主…...

Ubuntu20.04安装Prometheus监控系统

环境准备&#xff1a; 服务器名称内网IP公网IPPrometheus服务器192.168.0.23047.119.21.167Grafana服务器192.168.0.23147.119.22.8被监控服务器192.168.0.23247.119.22.82 更改主机名方便辨认 hostnamectl set-hostname prometheus hostnamectl set-hostname grafana hostn…...

kafka consumer客户端消费逻辑解析

kafka consumer客户端消费逻辑解析 一、主要步骤二、提交策略【步骤2代码解析】【提交策略总结】 三、拉取策略四、消费策略【代码解析】【消费策略总结】 一、主要步骤 这是kafka客户端拉取消息的入口&#xff0c;有4个主要部分 1、启动后的准备 consumer线程启动后&#xff…...

打印机出现多个副本无法删除

打印机出现多个副本很烦人&#xff0c;尤其是在打印机在局域网内被多个主机共享的时候&#xff0c;一旦出现新的副本&#xff0c;原有副本全都变成脱机状态&#xff0c;其他电脑连接的共享打印机是原来的副本&#xff0c;所以要重新设置打印机共享&#xff0c;很烦人。 想要删…...

FlinkSQL 开发经验分享

作者&#xff1a;汤包 最近做了几个实时数据开发需求&#xff0c;也不可避免地在使用 Flink 的过程中遇到了一些问题&#xff0c;比如数据倾斜导致的反压、interval join、开窗导致的水位线失效等问题&#xff0c;通过思考并解决这些问题&#xff0c;加深了我对 Flink 原理与机…...

JVM原理(十二):JVM虚拟机类加载过程

一个类型从被加载到虚拟机内存中开始&#xff0c;到卸载为止&#xff0c;它的整个生命周期将会经过 加载、验证、准备、解析、初始化、使用、卸载七个阶段。其中 验证、准备、解析三个部分统称为 连接 1. 加载 加载是整个类加载的一个过程。在加载阶段&#xff0c;Java虚拟机…...

Apipost接口测试工具的原理及应用详解(三)

本系列文章简介: 随着软件行业的快速发展,API(应用程序编程接口)作为不同软件组件之间通信的桥梁,其重要性日益凸显。API的质量直接关系到软件系统的稳定性、性能和用户体验。因此,对API进行严格的测试成为软件开发过程中不可或缺的一环。在众多API测试工具中,Apipost凭…...

unity里鼠标位置是否在物体上。

1. 使用Raycast 如果你的图片是在UI Canvas上&#xff0c;可以使用Raycast来检测鼠标点击是否在图片上。 using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class ImageClickChecker : MonoBehaviour { public Image targetImage; voi…...

Java知识点大纲

文章目录 第一阶段&#xff1a;JavaSE1、面向对象编程(基础)1)面向过程和面向对象区别2)类和对象的概述3)类的属性和方法4)创建对象内存分析5)构造方法(Construtor)及其重载6)对象类型的参数传递7)this关键字详解8)static关键字详解9)局部代码块、构造代码块和静态代码块10)pac…...

【Kafka】记录一次Kafka消费者重复消费问题

文章目录 现象业务背景排查过程Push与Pull 现象 用户反馈消费者出现消息积压&#xff0c;并且通过日志看&#xff0c;一直重复消费&#xff0c;且没有报错日志。 业务背景 用户的消费者是一个将文件做Embedding的任务&#xff0c;&#xff08;由于AI技术的兴起&#xff0c;大…...

Android使用http加载自建服务器静态网页

最终效果如下图&#xff0c;成功加载了电脑端的静态网页内容&#xff0c;这是一个xml文件。 电脑端搭建http服务器 使用“Apache Http Server”&#xff0c;下载地址是&#xff1a;https://httpd.apache.org/download.cgi。 安装启动步骤&#xff0c;参考&#xff1a;Apach…...

5分钟掌握League Akari:英雄联盟玩家的智能助手终极指南

5分钟掌握League Akari&#xff1a;英雄联盟玩家的智能助手终极指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari…...

从零部署RK3588 MPP:硬编解码环境搭建与核心工具解析

1. RK3588 MPP硬编解码环境搭建全流程 第一次在ArmSoM-W3开发板上折腾RK3588的MPP硬编解码环境时&#xff0c;我踩了不少坑。这里把完整搭建过程拆解成可复现的步骤&#xff0c;用最直白的语言分享给各位开发者朋友。 MPP&#xff08;Media Process Platform&#xff09;是瑞芯…...

机器人路径规划算法之VFH算法详解+MATLAB代码实现

目录 一、 运作原理&#xff1a;三步把地图变成方向 1. 建图&#xff1a;构建直方图网格&#xff08;Histogram Grid&#xff09; 2. 降维&#xff1a;生成极坐标直方图&#xff08;Polar Histogram&#xff09; 3. 决策&#xff1a;代价函数与山谷选择 二、 算法演进&…...

Java中正确比较数组最小值的两种方法

本文旨在解决Java Stream 当API使用min()方法获得数组最小值时&#xff0c;返回optionalint类型导致的直接比较错误。我们将深入探讨这个问题的根源&#xff0c;并提供两个有效的解决方案&#xff1a;一是比较Optionalint的getasint()方法&#xff0c;二是引入apache Commons N…...

LongCat-Image-Edit图片编辑神器:5分钟快速部署,一句话精准改图

LongCat-Image-Edit图片编辑神器&#xff1a;5分钟快速部署&#xff0c;一句话精准改图 1. 产品核心能力介绍 LongCat-Image-Edit是美团LongCat团队推出的开源图像编辑模型&#xff0c;它让复杂的图片编辑变得像说话一样简单。这个模型有三大杀手锏&#xff1a; 一句话精准编…...

类和对象(中)——运算符重载

引入语言在语法上可以直接用指令实现运算符对 内置类型 的操作C中加入了类类型&#xff0c;那如何使用以前的运算符&#xff08;如 - * / 等&#xff09;&#xff0c;对类类型进行操作呢&#xff1f;由此引入运算符重载&#xff1a;C为了增强代码的可读性引入了运算…...

经典位运算和计算各进制下的各位数字之和

(num & (num - 1)) 是检测2的幂的经典位运算方法&#xff0c;结果为0即为2的幂 if ((num & (num - 1)) ! 0) 按位与&#xff1a; 0 & 0 0 0 & 1 0 1 & 0 0 1 & 1 1 全 1 才 1&#xff0c;有 0 则 0 int lowbit(int x) { …...

2026权威评测:盘点毕业论文AIGC免费降重神器

【CSDN 资深算法架构师 / NLP技术专栏 导读】 各位还在发际线边缘挣扎的应届生和硕博党们&#xff0c;到了2026年&#xff0c;如果你的电脑里还装着那种老掉牙的“同义词替换”降重软件&#xff0c;我劝你赶紧停手&#xff01; 最近CSDN社群里哀嚎一片&#xff1a;“知网查重过…...

【Python SM9性能生死线】:当SM9签名延迟突破120ms,你必须立即检查的4个Cython绑定陷阱

第一章&#xff1a;Python SM9性能生死线的临界认知SM9作为我国自主设计的标识密码算法标准&#xff08;GB/T 38635–2020&#xff09;&#xff0c;其在Python生态中的实现常因底层运算瓶颈而陷入“可运行但不可用”的灰色地带。性能临界点并非由单一因素决定&#xff0c;而是密…...

SpeedyStepper Forked:嵌入式步进电机硬实时控制库解析

1. SpeedyStepper Forked&#xff1a;面向嵌入式实时控制的高性能步进电机驱动库深度解析1.1 库定位与工程价值SpeedyStepper Forked 是一个专为嵌入式平台&#xff08;尤其是基于Arduino生态的MCU&#xff09;设计的轻量级、高精度步进电机运动控制库。其核心目标并非提供图形…...