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元素ref
    const 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封装】。关注本栏目,将实时更新。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

顶顶通语音信箱手机助手拦截方案(mod_cti基于FreeSWITCH)

文章目录 前言联系我们拦截方案方案一&#xff1a;空号识别拦截拦截时间原理能够识别出的状态 方案二&#xff1a;实时质检拦截拦截时间原理拦截效果展示 服务器配置要求 前言 顶顶通拥有两种语音信箱手机助手拦截方案&#xff1a; 方案一&#xff1a;空号识别拦截&#xff0…

springboot接口防抖【防重复提交】

什么是防抖 所谓防抖&#xff0c;一是防用户手抖&#xff0c;二是防网络抖动。在Web系统中&#xff0c;表单提交是一个非常常见的功能&#xff0c;如果不加控制&#xff0c;容易因为用户的误操作或网络延迟导致同一请求被发送多次&#xff0c;进而生成重复的数据记录。要针对用…

成都百洲文化传媒有限公司电商服务的佼佼者

在当今这个数字化时代&#xff0c;电商已成为商业发展的核心动力之一。成都百洲文化传媒有限公司&#xff0c;作为一家专注于电商服务的领先企业&#xff0c;正以其卓越的服务质量和前瞻性的战略眼光&#xff0c;引领着电商行业的新潮流。 一、公司简介 成都百洲文化传媒有限公…

sssssssssssssssshare_ptrrrrrrrrrrrrrrrrrrrrrrrrr

智能指针——shared_ptr的原理及仿写 shared_ptr的原理及仿写 共享指针允许多个指针指向同一份数据&#xff0c;因为它使用了引用计数&#xff0c;每多一个指针指向这个数据&#xff0c;引用技术加一&#xff0c;每销毁一个指针&#xff0c;引用技术减一&#xff0c;如果引用计…

拓展欧几里得和裴蜀定理

裴蜀定理&#xff08;或贝祖定理&#xff09;说明了对任何整数a、b和它们的最大公约数d&#xff0c;关于未知数x和y的线性不定方程&#xff08;称为裴蜀等式&#xff09;&#xff1a;若a,b是整数,且gcd(a,b)d&#xff0c;那么对于任意的整数x,y,axby都一定是d的倍数&#xff0c…

【安全攻防】网络安全中的序列化与反序列

1.序列化与反序列化 首先要了解序列化与反序列化的定义&#xff0c;以及序列化反序列化所用到的基本函数。 序列化&#xff1a;把对象转换为字节序列的过程称为对象的序列化&#xff0c;相当于游戏中的存档。 PHP中的序列化函数serialize() **serialize()**函数用于序列化对…

jsqlparse工具拦截sql处理和拓展

前置知识 访问者模式 &#xff08;Visitor Pattern&#xff09;是一种行为设计模式&#xff0c;它允许你定义在不改变被访问元素的类的前提下&#xff0c;扩展其功能。通过将操作&#xff08;操作或算法&#xff09;从对象结构中提取出来&#xff0c;可以在不修改这些对象的前…

6.基于SpringBoot的SSMP整合案例-业务层开发

目录 1.业务层标准开发 1.1接口定义 1.2实现类定义 1.3测试类定义 1.4小结&#xff1a; 2.业务层快速开发 2.1使用MyBatisP1us提供有业务层通用接口(ISerivce)与业务层通用实现类(ServiceImpl),t> 接口定义&#xff1a; 实现类定义&#xff1a; 测试类&#xff1a; …

MergeBus封装模块

当模型有很多信号进行交互的时候&#xff0c;并且已经无法回避线条交叉的时候&#xff0c;我们会选择 From和Goto模块来提高模型的可读性&#xff0c;假如你拿到的模型如下图&#xff1a; 像不像芯片的电路&#xff0c;错综而复杂 该如何整理呢&#xff1f; 我相信有很多模型…

2024年移动手游趋势:休闲类手游收入逆势增长,欧美玩家成为主力

移动手游广告情报平台Sensor Tower近期发布的报告显示&#xff0c;从宏观数据来看&#xff0c;尽管2023年对于移动游戏市场来说是艰难的一年&#xff0c;无论是总下载量亦或是总收入都较去年有所下降&#xff0c;尤其是Google Play。但在总体下降的大趋势下&#xff0c;休闲游戏…

mac如何压缩视频大小不改变画质,mac怎么压缩视频软件

在数字时代&#xff0c;视频已成为信息传递和娱乐消遣的重要媒介。然而&#xff0c;视频带来的愉悦体验背后&#xff0c;是日益增长的存储和分享压力。大视频文件不仅占用大量存储空间&#xff0c;上传和下载也变得异常缓慢。那么&#xff0c;如何才能有效压缩视频&#xff0c;…

SAP中的 UPDATA TASK 和 BACKGROUND TASK

前言&#xff1a; 记录这篇文章起因是调查生产订单报工问题引申出来的一个问题&#xff0c;后来再次调查后了解了其中缘由&#xff0c;大概记录以下&#xff0c;如有不对&#xff0c;欢迎指正。问题原贴如下&#xff1a; SAP CO11N BAPI_PRODORDCONF_CREATE_TT连续报工异步更…

LoadRunner-Virtual User Generator组件学习(录制不上内容)

重点知识 LR工具是拿C写的&#xff0c;所以它的脚本默认也是C&#xff0c;但是最终生成的脚本不止是C&#xff0c;它是支持C和Java语言的&#xff0c;这个大家要清楚&#xff0c;对本身懂代码的就很友好&#xff0c;你了解java&#xff0c;那就可以把脚本改成java&#xff0c;…

不看后悔!国内AI大比拼的精彩看点全汇总

至2022年AI爆发后&#xff0c;在中国已催生了上千个AI产品。 这些产品涵盖了从头部大厂到高等院校&#xff0c;再到初创企业的广泛阵容。 如&#xff1a; 大厂&#xff1a;百度文心、阿里通义、腾讯元宝、字节豆包、讯飞星火等高校&#xff1a;清华大学、北京大学等初创&…

.NET 漏洞分析 | 某ERP系统存在SQL注入

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

JAVA导出数据库字典到Excel

文章目录 1、查询某张表字段信息2、TableVo接收sql查询得到的数据3、excel导出4、导出案例 1、查询某张表字段信息 select column_name as columnName, -- 字段名 COLUMN_DEFAULT as colDefault, -- 默认值 column_key as columnKey, -- PRI-主键&#xff0c;UNI-唯一键&…

机器学习原理之 -- 朴素贝叶斯分类器:由来及原理详解

朴素贝叶斯&#xff08;Naive Bayes&#xff09;分类器是一类基于贝叶斯定理&#xff08;Bayes Theorem&#xff09;的简单而有效的概率分类算法。由于其假设特征之间的条件独立性&#xff0c;因此被称为“朴素”贝叶斯分类器。尽管这种独立性假设在现实中很少完全成立&#xf…

VSCode使用ipynb文件高效地进行功能测试

一、ipynb是什么文件 .ipynb文件是Jupyter Notebook的专用格式&#xff0c;它允许用户在一个网页应用中混合编写Markdown文本、执行代码、查看输出结果及图表。Jupyter Notebook的本质是一个Web应用程序&#xff0c;支持运行40多种编程语言&#xff0c;包括Python。它的主要用…

Elasticsearch运维系列_ES之max_result_window 含义-对性能影响及参数调整

如果你觉得这篇文章能给你带来收获&#xff0c;请关注我公众号: 这篇文章主要给大家介绍max_result_window参数及其对性能影响。 Part1 背景描述 当前某个业务xxxdb单个索引值较大&#xff0c;每日单个索引大小在二三百G&#xff0c;当前索引保留15天&#xff0c;如果拉取一个…