键盘快捷键设置录入
效果图:

代码:
import React, {useContext, useEffect, useRef} from 'react'
import {message} from "antd";
import lodash from "lodash";
import {StateContext} from '../../index.tsx'
import {useUpdateEffect} from "ahooks";
import './index.less'const funcKeys = ['control','shift','alt']
const fCodes = ['f1','f2','f3','f4','f5','f6','f7','f8','f9','f10','f11','f12']
const aCodes = ['q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'
].map((v:any) => 'key' + v)
let downCount = 0
let strArr: string[] = []const placeholder = 'ctrl/shift/alt+a-z,F1-F12'const Shortcut = () => {const {shortcut,} = useContext<any>(StateContext)const refSearch = useRef<any>(null)const refOrderLink = useRef<any>(null)const refCanteen = useRef<any>(null)const refOrderMark = useRef<any>(null)const refSubmit = useRef<any>(null)const refReset = useRef<any>(null)const refCreate = useRef<any>(null)const relationArr:any = [[refSearch, 'search'],[refOrderLink, 'orderLink'],[refCanteen, 'canteen'],[refOrderMark, 'orderMark'],[refSubmit, 'submit'],[refReset, 'reset'],[refCreate, 'create']]useUpdateEffect(() => {relationArr.forEach((v:any) => {if ( shortcut[v[1]] ) {v[0].current.value = shortcut[v[1]]}})}, [shortcut]);const onKeyDown = (e: any) => {let {key, code} = ekey = key.toLowerCase()code = code.toLowerCase()// 判定是否是有效值if (funcKeys.includes(key) || aCodes.includes(code) || fCodes.includes(code)) {} else {return}// 判定是否已经包含if (strArr.includes(key) || strArr.includes(code)) {return}// 如果是初次按下,需要重置str的值if (downCount === 0) {strArr = []}// 记录按键if (funcKeys.includes(key)) {strArr.push(key)}if (aCodes.includes(code)) {strArr.push(code)}if (fCodes.includes(code)) {strArr.push(code)}downCount++e.target.value = strArr.map(v => v.replace('key', '')).join('+')}const onKeyUp = (e: any) => {downCount--if (downCount <= 0) {downCount = 0strArr = []}}// 验证快捷键设置:1 不能重复,2 至少包含一个功能键 + 字母键 3 f1-f12不用包含功能键const checkValidateData = () => {const tmpArr = []for (let i=0; i<relationArr.length; i++) {const item = relationArr[i]if (item[0].current.value) {if (fCodes.includes(item[0].current.value)) {} else {const tArr2 = item[0].current.value.split('+').sort()let hasFunc = false // 包含功能键let hasCode = false // 包含字母键tArr2.forEach((v2:any) => {if (funcKeys.includes(v2)) {hasFunc = true} else if (aCodes.includes('key' + v2)) {hasCode = true}})if (hasFunc && hasCode) {tmpArr.push(tArr2.toString())} else {item[0].current.value = ''message.warn(`快捷键规则:${placeholder}`)return false}}}}// 检查是否重复if (tmpArr.length !== lodash.uniq(tmpArr).length) {message.warn('快捷键重复')return false}return true}const onFocus = (e: any) => {const val = e.target.value// @ts-ignoreval && window.electronAPI && window.electronAPI.changeShortcut({tp: 'delete',val})}const onBlur = () => {const rOk = checkValidateData()// if (!rOk) return;// 保存数据到storeconst tmpObj: any = {}relationArr.forEach((item: any) => {tmpObj[item[1]] = item[0].current.value})// @ts-ignorewindow.electronAPI && window.electronAPI.changeShortcut({tp: 'create',val: tmpObj})}return <div className={'page-config page-shortcut'}><ul><li><span>搜索订单:</span><inputref={refSearch}readOnlyplaceholder={placeholder}onKeyDown={onKeyDown}onKeyUp={onKeyUp}onFocus={onFocus}onBlur={onBlur}/></li><li><span>订单号或选店链接:</span><inputref={refOrderLink}readOnlyplaceholder={placeholder}onKeyDown={onKeyDown}onKeyUp={onKeyUp}onFocus={onFocus}onBlur={onBlur}/></li><li><span>餐厅代码:</span><inputref={refCanteen}readOnlyplaceholder={placeholder}onKeyDown={onKeyDown}onKeyUp={onKeyUp}onFocus={onFocus}onBlur={onBlur}/></li><li><span>订单备注(可空):</span><inputref={refOrderMark}readOnlyplaceholder={placeholder}onKeyDown={onKeyDown}onKeyUp={onKeyUp}onFocus={onFocus}onBlur={onBlur}/></li><li><span>提交:</span><inputref={refSubmit}readOnlyplaceholder={placeholder}onKeyDown={onKeyDown}onKeyUp={onKeyUp}onFocus={onFocus}onBlur={onBlur}/></li><li><span>清空:</span><inputref={refReset}readOnlyplaceholder={placeholder}onKeyDown={onKeyDown}onKeyUp={onKeyUp}onFocus={onFocus}onBlur={onBlur}/></li><li><span>创建:</span><inputref={refCreate}readOnlyplaceholder={placeholder}onKeyDown={onKeyDown}onKeyUp={onKeyUp}onFocus={onFocus}onBlur={onBlur}/></li></ul></div>
}Shortcut.displayName = 'Shortcut'
export default Shortcut
主要onKeyDown和onKeyUp方法的处理,见代码
相关文章:
键盘快捷键设置录入
效果图: 代码: import React, {useContext, useEffect, useRef} from react import {message} from "antd"; import lodash from "lodash"; import {StateContext} from ../../index.tsx import {useUpdateEffect} from "ahoo…...
刷题Day49|647. 回文子串、516.最长回文子序列
647. 回文子串 647. 回文子串 - 力扣(LeetCode) 思路:递推公式的含义是[i, j]内的子串是否为回文子串(bolean[][])。一共两种情况:s[i] s[j],i和j相差1以外就得判断中间包含的的字符串是否为回文了&…...
关于transformers库验证时不进入compute_metrics方法的一些坑
生成式任务输入就是标签 transformers在进入compute_metrics前会有一个判断,源码如下: # 版本 transformers4.41.2 # 在trainer.py 的 3842 行 # Metrics! if (self.compute_metrics is not Noneand all_preds is not Noneand all_labels is not Nonea…...
苹果提出RLAIF:轻量级语言模型编写代码
获取本文论文原文PDF,请在公众号【AI论文解读】留言:论文解读 代码生成一直是一个充满挑战的领域。随着大型语言模型(LLM)的出现,我们见证了在自然语言理解和生成方面的显著进步。然而,当涉及到代码生成&a…...
[leetcode] shortest-subarray-with-sum-at-least-k 和至少为 K 的最短子数组
. - 力扣(LeetCode) class Solution { public:int shortestSubarray(vector<int>& nums, int k) {int n nums.size();vector<long> preSumArr(n 1);for (int i 0; i < n; i) {preSumArr[i 1] preSumArr[i] nums[i];}int res n…...
专业140+总分420+天津大学815信号与系统考研经验天大电子信息与通信工程,真题,大纲,参考书。
顺利上岸天津大学,专业课815信号与系统140,总分420,总结一些自己的复习经历,希望对于报考天大的同学有些许帮助,少走弯路,顺利上岸。专业课: 815信号与系统:指定教材吴大正…...
前端如何取消接口调用
🧑💻 写在开头 点赞 收藏 学会🤣🤣🤣 1. xmlHttpRequest是如何取消请求的? 实例化的XMLHttpRequest对象上也有abort方法 const xhr new XMLHttpRequest(); xhr.addEventListener(load, function(e)…...
k8s 容器环境下的镜像如何转换为docker 使用
在无法连接registry 的环境中,想要把 crictl 中的镜像给docker 使用,应该怎么处理? 其实容器镜像是通用的,crictl 和ctr 以及docker 镜像是可以互相使用的,因为docker 在1.10版本之后遵从了OCI。所以crictl 环境下的镜…...
FreeRTOS 队列
队列是一种任务到任务、任务到中断、中断到任务数据交流的一种机制。在队列中可以存 储数量有限、大小固定的多个数据,队列中的每一个数据叫做队列项目,队列能够存储队列项 目的最大数量称为队列的长度,在创建队列的时候,就需要指…...
如何识别图片文字转化为文本?5个软件帮助你快速提取图片文字
如何识别图片文字转化为文本?5个软件帮助你快速提取图片文字 将图片中的文字提取为文本是一项非常有用的技能,特别是当你需要处理大量扫描文档、截图或其他图片时。以下是五款能够帮助你快速提取图片文字的软件: 迅捷文字识别 这是一款非…...
Flink SQL kafka连接器
版本说明 Flink和kafka的版本号有一定的匹配关系,操作成功的版本: Flink1.17.1kafka_2.12-3.3.1 添加kafka连接器依赖 将flink-sql-connector-kafka-1.17.1.jar上传到flink的lib目录下 下载flink-sql-connector-kafka连接器jar包 https://mvnreposi…...
glm-4 联网搜索 api 测试
今天测试了一下 glm-4 的联网搜索 web_search tool 调用,发现了 web_search 的网页检索返回结果中几个比较诡异的事情,特此记录: 有些检索结果没有 icon、link、media 字段,但从内容上看确实是联网搜索出来的结果,不知…...
Java毕业设计 基于SSM vue图书管理系统小程序 微信小程序
Java毕业设计 基于SSM vue图书管理系统小程序 微信小程序 SSM 图书管理系统小程序 功能介绍 用户 登录 注册 首页 图片轮播 图书信息推荐 图书详情 赞 踩 评论 收藏 系统公告 公告详情 用户信息修改 我的待还 图书归还 催还提醒 我的收藏管理 意见反馈 管理员 登录 个人中心…...
bert训练的一些技巧(rand() < self.skipgram_prb)
rand() < self.skip_gram_prb) 是一个条件表达式,用来判断是否进行skip-gram掩码操作。这种掩码操作通常用于自然语言处理中的数据增强,通过概率决定是否应用skip-gram掩码。下面是对这个表达式的详细解释: 解释 rand(): rand() 是一个随…...
pandas修改时间索引报错处理
import pandas as pd import numpy as np import osdfpd.DataFrame(index[a,b,c],data{序列:[1,2,3]}) df.rename(index{a:a1},inplaceTrue) print(df) print(df.index.dtype)df1pd.DataFrame(index[2024-01-01,2024-01-02,2024-01-03],data{序列:[1,2,3]}) df1.rename(index{2…...
Nginx Bla~Bla~
root 和 alias指令都用于指定服务器上的文件系统路径,但它们在用法和行为上有一些不同 root指令通常用于在Nginx配置中定义一个目录,该目录将作为请求的根目录。 server { location /static/ {root /var/www; 请求 /static/index.html 将映射到 /v…...
java awt和swing介绍
Java AWT(Abstract Window Toolkit)和 Swing 是用于创建图形用户界面(GUI)的 Java API。 AWT AWT 是 Java 最初的平台依赖的窗口图形界面工具包,它提供了一组基本的 GUI 组件、窗口管理、事件处理等。AWT 组件是重量…...
奇怪的错误记录
https://github.com/meta-llama/llama3/issues/80 读模型没问题,推理时出现: RuntimeError: “triu_tril_cuda_template” not implemented for ‘BFloat16’ ———————————————— 事发原因 我尝试了解transformers的AutoProcessor时&a…...
来啦,经典传说大变身牛郎织女后代逗趣日常
《落凡尘:星宿大冒险》来啦! 经典传说大变身,牛郎织女后代金风, 上演一出“星际小侦探”的逗趣日常! 想象一下,二十八星宿那些傲娇的星星们, 居然能“离家出走”,还差点把天给掀了…...
【uniapp-ios】App端与webview端相互通信的方法以及注意事项
前言 在开发中,使用uniapp开发的项目开发效率是极高的,使用一套代码就能够同时在多端上线,像笔者之前写过的使用Flutter端和webview端之间的相互通信方法和问题,这种方式本质上实际上是h5和h5之间的通信,网上有非常多…...
基于九轴传感器 + K-means 聚类的振动异常检测实战教程
(嵌入式 / 工业监测场景:设备振动、电机故障、结构松动、碰撞异常实时检测)一、前言(你能学到什么)这篇文章不讲虚的,直接带你做一个工业级轻量异常检测系统:用 LSM6DS3TR-C(6 轴&am…...
Driver Store Explorer终极指南:三步清理Windows冗余驱动,快速释放数十GB空间
Driver Store Explorer终极指南:三步清理Windows冗余驱动,快速释放数十GB空间 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否发现Windows系统盘空间越来越…...
如何通过GDScript游戏开发入门成为独立游戏开发者
如何通过GDScript游戏开发入门成为独立游戏开发者 【免费下载链接】learn-gdscript Learn Godots GDScript programming language from zero, right in your browser, for free. 项目地址: https://gitcode.com/gh_mirrors/le/learn-gdscript 对于许多游戏爱好者来说&am…...
安卓音频问题解决记录(一)
本文记录在安卓framework开发过程中遇到的一些音频问题的解决办法。 1.支持多应用同时录音(安卓10以上) 通过日志分析,发现当另一个应用打开录音的时候会被静音,日志如下: APM_AudioPolicyManager: setAppState(portId:43, state:2) APM_AudioPolicyManager: set…...
Notepad--:当文本编辑遇到真正的跨平台解决方案
Notepad--:当文本编辑遇到真正的跨平台解决方案 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- 你是否曾因…...
LIF蛋白的结构特征与生物学功能研究
一、LIF蛋白的分子结构与分类白血病抑制因子属于IL-6细胞因子家族,是一种多功能的糖蛋白。该蛋白由180个氨基酸残基组成,分子量约为20至25千道尔顿,包含七个α-螺旋结构域,形成典型的上束螺旋结构。LIF蛋白的基因定位于22号染色体…...
实测Qwen-Image-Edit-2511:输入一张图,输出360°环绕视角,效果太强了
实测Qwen-Image-Edit-2511:输入一张图,输出360环绕视角,效果太强了 1. 引言:单图变多视角的技术突破 想象一下,你只需要一张普通的商品照片,就能自动生成360度全方位的展示效果。这不是科幻电影里的场景&…...
重构macOS滚动体验:Scroll Reverser的跨设备解决方案
重构macOS滚动体验:Scroll Reverser的跨设备解决方案 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 破解多设备滚动的混乱困局 当设计师小李同时连接数位板和鼠标工…...
VR环保学习机|开启沉浸式环保教育新时代
在环保教育不断升级的今天,如何让公众尤其是青少年真正理解环保的重要性、养成绿色习惯,已经成为教育领域的重要课题。传统的图文讲解虽然内容充足,却往往缺少互动性和代入感,难以让学习者产生深刻的记忆。VR环保学习机正是在这样…...
显卡显存稳定性终极检测指南:memtest_vulkan免费工具快速诊断GPU问题
显卡显存稳定性终极检测指南:memtest_vulkan免费工具快速诊断GPU问题 【免费下载链接】memtest_vulkan Vulkan compute tool for testing video memory stability 项目地址: https://gitcode.com/gh_mirrors/me/memtest_vulkan 核心关键词:显卡显…...
