复制 生成二维码

一、安装插件

1、复制

npm install -g copy-to-clipboard

import copy from 'copy-to-clipboard';

2、生成二维码 & 下载

npm install -g qrcode

import QRCode from 'qrcode.react';

二、功能:生成二维码 & 下载

效果图

1、常规使用(下载图片模糊)

会有个问题:生成的二维码设置了 28px,下载的时候也是 28px,使用图片放大下载的图片就模糊。

        renderer: ({ record }) => {const url = record.get('registrationUrl');const downloadQRCode = () => {const canvas = document.getElementById('qrCodeEl');const image = canvas.toDataURL('image/png');const link = document.createElement('a');link.download = 'qrcode.png';link.href = image;link.click();};return (<>{url && (<div className={styles.registrationSource_down}><QRCodeid="qrCodeEl"value={url}size={28}level="H"includeMargin={true}style={{ border: '1px solid rgb(233, 238, 242)' }}/><span style={{ cursor: 'pointer' }} onClick={downloadQRCode}><imgsrc={require('@/assets/imgs/down.png')}alt="下载二维码"/></span></div>)}</>);},

2、隐藏大尺寸二维码(推荐)

        renderer: ({ record }) => {const url = record.get('registrationUrl');const downloadRef = useRef<HTMLDivElement>(null);const downloadQRCode = () => {if (!downloadRef.current) return;const canvas = downloadRef.current.querySelector('canvas');if (!canvas) return;const image = canvas.toDataURL('image/png');const link = document.createElement('a');link.download = 'qrcode.png';link.href = image;link.click();};return (<>{url && (<div className={styles.registrationSource_down}>{/* 显示用小尺寸(28px) */}<QRCodevalue={url}size={28}level="H"includeMargin={true}style={{ border: '1px solid rgb(233, 238, 242)' }}/>{/* 隐藏的大尺寸(100px)仅用于下载 */}<div style={{ display: 'none' }} ref={downloadRef}><QRCodevalue={url}size={160}level="H"includeMargin={true}/></div><span style={{ cursor: 'pointer' }} onClick={downloadQRCode}><imgsrc={require('@/assets/imgs/down.png')}alt="下载二维码"/></span></div>)}</>);},

三、复制

效果图

1、功能实现

        renderer: ({ record }) => {const url = record.get('registrationUrl');const handleCopy = () => {copy(url);message.success(languageConfig('tips.copySuccess', '复制成功!'),1.5,'top',);};return (<><span>{url}</span><spanstyle={{ marginLeft: '6px', cursor: 'pointer' }}onClick={handleCopy}><img src={require('@/assets/imgs/copy.svg')} alt="" /></span></>);},

四、具体场景

需求:根据'输入内容'生成url(可复制),再根据url生成图片(可下载)

效果图

1、功能实现

import {Form,Modal,useDataSet,message,TextField,Button,
} from 'choerodon-ui/pro';
import React, { useEffect, useRef, useState } from 'react';
import { LabelLayout } from 'choerodon-ui/pro/lib/form/enum';
import { FieldType } from 'choerodon-ui/dataset/data-set/enum';
import formatterCollections from 'hzero-front/lib/utils/intl/formatterCollections';
import {commonModelPrompt,languageConfig,prdTemCode,
} from '@/language/language';
import {RegistrationRecord,RegistrationSourceCreateProps,
} from '@/interface/registrationSource/main';
import { organizationId } from '@/common/config';
import {getRegistrationSourceDetail,postRegistrationSourceEdit,
} from '@/api/registrationSource/main';
import '@/assets/styles/c7n.less';
import { ButtonColor, FuncType } from 'choerodon-ui/pro/lib/button/enum';
import copy from 'copy-to-clipboard';
import QRCode from 'qrcode.react';
import styles from '../list/main.less';const CreateModel: React.FC<RegistrationSourceCreateProps> = ({/** 控制弹框显示/隐藏 */visible,/** 设置弹框显示/隐藏的回调函数 */setVisible,/** 弹框关闭后回调函数 */onSelect,infoData,
}) => {const { edit, id } = infoData;const url = 'http://wwww.shuaishuaige.com/login';/** ds */const [, setUpdateDs] = useState(new Date().getTime());const formDataDs = useDataSet(() => {return {autoCreate: true,fields: [{name: 'registrationSource',type: FieldType.string,label: languageConfig('registrationSource.label.registrationSource','注册来源',),placeholder: languageConfig('registrationSource.label.registrationSource','注册来源',),maxLength: 30,required: true,},{name: 'registrationCode',type: FieldType.string,},{name: 'registrationUrl',type: FieldType.string,},],events: {update: () => {setUpdateDs(new Date().getTime());},},};}, []);/** 详情 */const getDetail = async () => {const res = await getRegistrationSourceDetail({ id });// console.log('详情res', res);formDataDs.current?.set({...res,});};useEffect(() => {if (visible) {formDataDs.loadData([{}]);if (edit) {getDetail();}openModal();}}, [visible]);/** 弹框打开 */const openModal = () => {Modal.open({title: edit? languageConfig('btn.edit.registrationSource', '编辑注册来源'): languageConfig('btn.add.registrationSource', '新增注册来源'),style: { width: '400px' },closable: true,maskClosable: true,keyboardClosable: false,onClose: () => {setVisible(false);},children: <Box />,onOk: async () => {const validate = await formDataDs.current?.validate(true);if (!validate) return false;const {id,objectVersionNumber,registrationSource,registrationCode,registrationUrl,} = formDataDs.current?.toData() || {};// 提交参数const params: RegistrationRecord = {registrationSource,registrationCode,registrationUrl,registrationStatus: 'Y',tenantId: organizationId,...(id ? { id, objectVersionNumber } : {}),};const res = await postRegistrationSourceEdit(params);if (res.failed) {message.error(res.message, 1.5, 'top');return false;}message.success(languageConfig('tips.operationSuccess', '操作成功!'),1.5,'top',);onSelect();},});};/** 内容 */const Box = () => {const [forceUpdate, setForceUpdate] = useState(false);useEffect(() => {const handler = () => {setForceUpdate(prev => !prev);};formDataDs.addEventListener('update', handler);return () => formDataDs.removeEventListener('update', handler);}, []);/** 复制 */const handleCopy = () => {const { registrationUrl } = formDataDs.current?.toData() || {};copy(registrationUrl);message.success(languageConfig('tips.copySuccess', '复制成功!'),1.5,'top',);};/** 下载 */const downloadRef = useRef<HTMLDivElement>(null);const downloadQRCode = () => {if (!downloadRef.current) return;const canvas = downloadRef.current.querySelector('canvas');if (!canvas) return;const image = canvas.toDataURL('image/png');const link = document.createElement('a');link.download = 'qrcode.png';link.href = image;link.click();};/** 生成url 和 图片 */const handleGenerate = async () => {const { registrationSource, registrationCode } =formDataDs.current?.toData() || {};// 1、code 不存在if (!registrationCode) {// 调用 apiconst res = await postRegistrationSourceEdit({registrationSource,tenantId: organizationId,});if (res.failed) {message.error(res.message, 1.5, 'top');return false;}formDataDs.loadData([res]);// url 接接const linkUrl = `${url}?RE=${res?.registrationCode}`;formDataDs.current?.set('registrationUrl', linkUrl);}// 2、code 存在const linkUrl = `${url}?RE=${formDataDs.current?.get('registrationCode',)}`;formDataDs.current?.set('registrationUrl', linkUrl);};return (<div className="ltc-c7n-style"><FormdataSet={formDataDs}columns={1}labelWidth={180}labelLayout={LabelLayout.vertical}useColon={false}><TextFieldname="registrationSource"onChange={val => {if (val === null) {formDataDs.current?.set('registrationUrl', '');}}}clearButton/><div style={{ marginTop: '4px' }}><ButtonfuncType={FuncType.raised}color={ButtonColor.primary}disabled={formDataDs.current?.get('registrationSource') ? false : true}onClick={handleGenerate}>{languageConfig('registrationSource.btn.generateUrl','生成url & 二维码',)}</Button></div>{formDataDs.current?.get('registrationUrl') && (<><div className={styles.registrationSource_url}><div className={styles.registrationSource_url_title}>{languageConfig('monthlyReports.label.registrationUrl','注册url',)}</div><div className={styles.registrationSource_url_text}><span>{formDataDs.current?.get('registrationUrl')}</span><Button funcType={FuncType.link} onClick={handleCopy}>{languageConfig('tips.copy', '复制')}</Button></div><divclassName={styles.registrationSource_url_title}style={{ marginTop: '16px' }}>{languageConfig('monthlyReports.label.registrationQrCode','注册二维码',)}</div><div className={styles.registrationSource_url_qrCode}>{/* 二维码 */}<div className={styles.registrationSource_url_qrCode_pic}>{/* 显示用小尺寸(64px) */}<QRCodevalue={formDataDs.current?.get('registrationUrl')}size={64}level="H"includeMargin={true}style={{ border: '1px solid rgb(233, 238, 242)' }}/>{/* 隐藏的大尺寸(100px)仅用于下载 */}<div style={{ display: 'none' }} ref={downloadRef}><QRCodevalue={formDataDs.current?.get('registrationUrl')}size={160}level="H"includeMargin={true}/></div></div>{/* 下载 */}<Button funcType={FuncType.link} onClick={downloadQRCode}>{languageConfig('tips.qrCodeTip', '下载')}</Button></div></div></>)}</Form></div>);};return <></>;
};export default formatterCollections({code: [prdTemCode, commonModelPrompt],
})(CreateModel);

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

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

相关文章

自由职业的经营视角

“领导力的核心是帮助他人看到自己看不到的东西。” — 彼得圣吉 最近与一些自由职业者的交流中&#xff0c;发现很多专业人士都会从专业视角来做交流&#xff0c;这也让我更加理解我们海外战略顾问庄老师在每月辅导时的提醒——经营者视角和专业人士视角的不同。这不仅让大家获…

MR30分布式 IO在物流堆垛机的应用

在现代物流行业蓬勃发展的浪潮中&#xff0c;物流堆垛机作为自动化仓储系统的核心设备&#xff0c;承担着货物的高效存取与搬运任务。它凭借自动化操作、高精度定位等优势&#xff0c;极大地提升了仓储空间利用率和货物周转效率。然而&#xff0c;随着物流行业的高速发展&#…

告别固定密钥!在单一账户下用 Cognito 实现 AWS CLI 的 MFA 单点登录

大家好&#xff0c;很多朋友&#xff0c;特别是通过合作伙伴或服务商使用 AWS 的同学&#xff0c;可能会发现自己的 IAM Identity Center 功能受限&#xff0c;无法像在组织管理账户里那样轻松配置 CLI 的 SSO (aws configure sso)。那么&#xff0c;我们就要放弃治疗&#xff…

未来机器视觉软件将更注重成本控制,边缘性能,鲁棒性、多平台支持、模块优化与性能提升,最新版本opencv-4.11.0更新了什么

OpenCV 4.11.0 作为 4.10.0 的后续版本,虽然没有在提供的搜索结果中直接列出详细更新内容,但结合 OpenCV 4.10.0 的重大改进方向(发布于 2024 年 6 月),可以合理推断 4.11.0 版本可能延续了对多平台支持、模块优化和性能提升的强化。以下是基于 OpenCV 近期更新模式的推测…

小程序入门:数据请求全解析

在微信小程序开发中&#xff0c;数据请求是实现丰富功能的关键环节。本文将带你深入了解小程序数据请求的相关知识&#xff0c;包括请求限制、配置方法以及不同请求方式的实现&#xff0c;还会介绍如何在页面加载时自动请求数据&#xff0c;同时附上详细代码示例&#xff0c;让…

开源版gpt4o 多模态MiniGPT-4 实现原理详解

MiniGPT-4是开源的GPT-4的平民版。本文用带你快速掌握多模态大模型MiniGPT-4的模型架构、训练秘诀、实战亮点与改进方向。 1 模型架构全景&#xff1a;三层协同 &#x1f4ca; 模型底部实际输入图像&#xff0c;经 ViT Q-Former 编码。蓝色方块 (视觉编码器)&#xff1a;左侧…

Flutter基础(控制器)

第1步&#xff1a;找个遥控器&#xff08;创建控制器&#xff09;​ // 就像买新遥控器要装电池 TextEditingController myController TextEditingController(); ​​第2步&#xff1a;连上你的玩具&#xff08;绑定到组件&#xff09;​​ TextField(controller: myContro…

Spring Boot使用Redis常用场景

Spring Boot使用Redis常用场景 一、概述&#xff1a;Redis 是什么&#xff1f;为什么要用它&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一个内存中的数据存储系统&#xff08;类似一个“超级大字典”&#xff09;&#xff0c;它能存各种类型的数据…

CAD文件处理控件Aspose.CAD教程:在 C# 中将 DXF 文件转换为 SVG - AutoCAD C# 示例

概述 使用 C# 轻松将DXF文件转换为SVG。此转换可更好地兼容 Web 应用程序&#xff0c;并增强 CAD 图纸的视觉呈现效果。使用Aspose.CAD for .NET &#xff0c;开发人员可以轻松实现此转换过程。该 SDK 提供强大的功能&#xff0c;使其成为 C# 开发人员的可靠选择。Aspose.CAD …

Gitee 持续集成与交付(CI/CD)篇

Gitee 持续集成与交付&#xff08;CI/CD&#xff09;篇 &#x1f680; 文章目录 Gitee 持续集成与交付&#xff08;CI/CD&#xff09;篇 &#x1f680;&#x1f3af; 什么是 CI/CD&#xff1f;&#x1f31f; Gitee Go 介绍✨ 核心特性&#x1f3a8; 支持的技术栈 &#x1f680;…

深度学习:PyTorch卷积神经网络图像分类案例分享

本文目录&#xff1a; 一、了解CIFAR-10数据集二、案例之导包三、案例之创建数据集四、案例之搭建神经网络&#xff08;模型构建&#xff09;五、案例之编写训练函数&#xff08;训练模型&#xff09;六、案例之编写预测函数&#xff08;模型测试&#xff09; 前言&#xff1a;…

记录多功能按键第二种写法使用定时器周期间隔判断.

逻辑是通过定时器溢出周期进行判断按下次数 比如设置定时器溢出周期为500MS,每次溢出都会判断按键按下次数,如果下个周期前没有触发按下,则结束键值判断.并确定触发键值.清空按下次数标志.测试比一个定时器周期按下按键次数判断写法要稳定... 记录STM32实现多功能按键_stm32一…

【安卓Sensor框架-1】SensorService 的启动流程

内核启动后&#xff0c;首个用户空间进程init&#xff08;pid1&#xff09;解析init.rc配置文件&#xff0c;启动关键服务&#xff08;如Zygote和ServiceManager&#xff09;。 Zygote服务配置为/system/bin/app_process --zygote --start-system-server&#xff0c;后续用于孵…

centos网卡绑定参考

同事整理分享&#xff1a; 1. 加载 Bonding 模块 modprobe bonding 获取网卡名称 ip a 找到接了网线的网卡名称&#xff0c;记下。 3. 配置物理网卡 创建并编辑 /etc/sysconfig/network-scripts/ifcfg-ens36&#xff08;ifcfg-后面的内容根据上面找到的具体网卡名称决定&#…

mbedtls ssl handshake error,res:-0x2700

用LinkSDK.c连接第三方云平台出现现象 解决方案&#xff1a; 在_tls_network_establish函数中加入 mbedtls_ssl_conf_authmode(&adapter_handle->mbedtls.ssl_config, MBEDTLS_SSL_VERIFY_NONE);原因解释&#xff1a;用连接方式是不用证书认证/跳过服务端认证。

Spring Security 的方法级权限控制是如何利用 AOP 的?

Spring Security 的方法级权限控制是 AOP 技术在实际应用中一个极其强大的应用典范。它允许我们以声明式的方式保护业务方法&#xff0c;将安全规则与业务逻辑彻底解耦。 核心思想&#xff1a;权限检查的“门卫” 你可以把 AOP 在方法级安全中的作用想象成一个尽职尽责的“门…

一键内网穿透,无需域名和服务器,自动https访问

cloudflare能将内网web转为外网可访问的地址。&#xff08;这和apiSQL有点类似&#xff0c;apiSQ可以将内网数据库轻松转换为外网的API&#xff0c;并且还支持代理内网已有API&#xff0c;增强安全增加API Key&#xff0c;以https访问等等&#xff09; 但Cloudfalre tunnel这个…

Sentinel(二):Sentinel流量控制

一、Sentinel 流控规则基本介绍 1、Snetinel 流控规则配置方式 Sentinel 支持可视化的流控规则配置&#xff0c;使用非常简单&#xff1b;可以在监控服务下的“簇点链路” 或 “流控规则” 中 给指定的请求资源配置流控规则&#xff1b;一般推荐在 “簇点链路” 中配置流控规则…

支持PY普冉系列单片机调试工具PY32linK仿真器

PY32 Link是专为 ‌PY32系列ARM-Cortex内核单片机‌&#xff08;如PY32F002A/030/071/040/403等&#xff09;设计的仿真器&#xff0c;支持全系列芯片的‌调试和仿真‌功能。‌开发环境兼容性‌支持主流IDE&#xff1a;‌Keil MDK‌ 和 ‌IAR Embedded Workbench‌&#xff0c;…

深入解析Python多服务器监控告警系统:从原理到生产部署

深入解析Python多服务器监控告警系统&#xff1a;从原理到生产部署 整体架构图 核心设计思想 无代理监控&#xff1a;通过SSH直接获取数据&#xff0c;无需在目标服务器安装代理故障隔离&#xff1a;单台服务器故障不影响整体监控多级检测&#xff1a;网络层→资源层→服务层层…