復制 生成二維碼

一、安裝插件

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
英文地址,請注明出處:http://en.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;網絡層→資源層→服務層層…