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

键盘快捷键设置录入

效果图:

代码:

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方法的处理,见代码

相关文章:

键盘快捷键设置录入

效果图&#xff1a; 代码&#xff1a; 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. 回文子串 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;递推公式的含义是[i, j]内的子串是否为回文子串&#xff08;bolean[][])。一共两种情况&#xff1a;s[i] s[j]&#xff0c;i和j相差1以外就得判断中间包含的的字符串是否为回文了&…...

关于transformers库验证时不进入compute_metrics方法的一些坑

生成式任务输入就是标签 transformers在进入compute_metrics前会有一个判断&#xff0c;源码如下&#xff1a; # 版本 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&#xff0c;请在公众号【AI论文解读】留言&#xff1a;论文解读 代码生成一直是一个充满挑战的领域。随着大型语言模型&#xff08;LLM&#xff09;的出现&#xff0c;我们见证了在自然语言理解和生成方面的显著进步。然而&#xff0c;当涉及到代码生成&a…...

[leetcode] shortest-subarray-with-sum-at-least-k 和至少为 K 的最短子数组

. - 力扣&#xff08;LeetCode&#xff09; 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信号与系统考研经验天大电子信息与通信工程,真题,大纲,参考书。

顺利上岸天津大学&#xff0c;专业课815信号与系统140&#xff0c;总分420&#xff0c;总结一些自己的复习经历&#xff0c;希望对于报考天大的同学有些许帮助&#xff0c;少走弯路&#xff0c;顺利上岸。专业课&#xff1a; 815信号与系统&#xff1a;指定教材吴大正&#xf…...

前端如何取消接口调用

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 1. xmlHttpRequest是如何取消请求的&#xff1f; 实例化的XMLHttpRequest对象上也有abort方法 const xhr new XMLHttpRequest(); xhr.addEventListener(load, function(e)…...

k8s 容器环境下的镜像如何转换为docker 使用

在无法连接registry 的环境中&#xff0c;想要把 crictl 中的镜像给docker 使用&#xff0c;应该怎么处理&#xff1f; 其实容器镜像是通用的&#xff0c;crictl 和ctr 以及docker 镜像是可以互相使用的&#xff0c;因为docker 在1.10版本之后遵从了OCI。所以crictl 环境下的镜…...

FreeRTOS 队列

队列是一种任务到任务、任务到中断、中断到任务数据交流的一种机制。在队列中可以存 储数量有限、大小固定的多个数据&#xff0c;队列中的每一个数据叫做队列项目&#xff0c;队列能够存储队列项 目的最大数量称为队列的长度&#xff0c;在创建队列的时候&#xff0c;就需要指…...

如何识别图片文字转化为文本?5个软件帮助你快速提取图片文字

如何识别图片文字转化为文本&#xff1f;5个软件帮助你快速提取图片文字 将图片中的文字提取为文本是一项非常有用的技能&#xff0c;特别是当你需要处理大量扫描文档、截图或其他图片时。以下是五款能够帮助你快速提取图片文字的软件&#xff1a; 迅捷文字识别 这是一款非…...

Flink SQL kafka连接器

版本说明 Flink和kafka的版本号有一定的匹配关系&#xff0c;操作成功的版本&#xff1a; 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 调用&#xff0c;发现了 web_search 的网页检索返回结果中几个比较诡异的事情&#xff0c;特此记录&#xff1a; 有些检索结果没有 icon、link、media 字段&#xff0c;但从内容上看确实是联网搜索出来的结果&#xff0c;不知…...

Java毕业设计 基于SSM vue图书管理系统小程序 微信小程序

Java毕业设计 基于SSM vue图书管理系统小程序 微信小程序 SSM 图书管理系统小程序 功能介绍 用户 登录 注册 首页 图片轮播 图书信息推荐 图书详情 赞 踩 评论 收藏 系统公告 公告详情 用户信息修改 我的待还 图书归还 催还提醒 我的收藏管理 意见反馈 管理员 登录 个人中心…...

bert训练的一些技巧(rand() < self.skipgram_prb)

rand() < self.skip_gram_prb) 是一个条件表达式&#xff0c;用来判断是否进行skip-gram掩码操作。这种掩码操作通常用于自然语言处理中的数据增强&#xff0c;通过概率决定是否应用skip-gram掩码。下面是对这个表达式的详细解释&#xff1a; 解释 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指令都用于指定服务器上的文件系统路径&#xff0c;但它们在用法和行为上有一些不同 root指令通常用于在Nginx配置中定义一个目录&#xff0c;该目录将作为请求的根目录。 server { location /static/ {root /var/www; 请求 /static/index.html 将映射到 /v…...

java awt和swing介绍

Java AWT&#xff08;Abstract Window Toolkit&#xff09;和 Swing 是用于创建图形用户界面&#xff08;GUI&#xff09;的 Java API。 AWT AWT 是 Java 最初的平台依赖的窗口图形界面工具包&#xff0c;它提供了一组基本的 GUI 组件、窗口管理、事件处理等。AWT 组件是重量…...

奇怪的错误记录

https://github.com/meta-llama/llama3/issues/80 读模型没问题&#xff0c;推理时出现&#xff1a; RuntimeError: “triu_tril_cuda_template” not implemented for ‘BFloat16’ ———————————————— 事发原因 我尝试了解transformers的AutoProcessor时&a…...

来啦,经典传说大变身牛郎织女后代逗趣日常

《落凡尘&#xff1a;星宿大冒险》来啦&#xff01; 经典传说大变身&#xff0c;牛郎织女后代金风&#xff0c; 上演一出“星际小侦探”的逗趣日常&#xff01; 想象一下&#xff0c;二十八星宿那些傲娇的星星们&#xff0c; 居然能“离家出走”&#xff0c;还差点把天给掀了…...

【uniapp-ios】App端与webview端相互通信的方法以及注意事项

前言 在开发中&#xff0c;使用uniapp开发的项目开发效率是极高的&#xff0c;使用一套代码就能够同时在多端上线&#xff0c;像笔者之前写过的使用Flutter端和webview端之间的相互通信方法和问题&#xff0c;这种方式本质上实际上是h5和h5之间的通信&#xff0c;网上有非常多…...

深度解析MSPM0G3106数据手册:从80MHz Cortex-M0+内核到电机控制实战

1. 项目概述&#xff1a;为什么是MSPM0G3106&#xff1f;如果你最近在寻找一款兼具高性能、低功耗和成本效益的微控制器&#xff0c;用于电机控制、数字电源或者需要复杂模拟信号处理的场合&#xff0c;那么TI的MSPM0G系列很可能已经进入了你的视野。而其中的MSPM0G3106&#x…...

B站视频转文字终极指南:如何用AI工具3步搞定视频内容整理

B站视频转文字终极指南&#xff1a;如何用AI工具3步搞定视频内容整理 【免费下载链接】bili2text Bilibili视频转文字&#xff0c;一步到位&#xff0c;输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 你是否曾为了一段精彩的B站课程内容反复…...

快速 AI 迭代仍然需要操作纪律

前言 配套资源&#xff1a;AI 辅助开发检查清单资源包&#xff0c;适合把本文的流程直接落成开发前检查表和复盘模板。 上一篇文章里&#xff0c;我把 AI 工作流拆成了几类任务模式&#xff1a;开发维护、探索学习、反馈确认。这个分类解决的是一个前置问题&#xff1a;在使用 …...

试0998y测试0998y试0998y测试0998y试0998y测试0998y试0998y测试0998y

试0998y测试0998y试0998y测试0998y试0998y测试0998y...

FreeRTOS优先级设置踩坑实录:为什么你的高优先级任务跑不起来?

FreeRTOS优先级设置实战指南&#xff1a;从原理到调试的完整解决方案 当你第一次在FreeRTOS中创建多个任务并设置不同优先级时&#xff0c;可能会遇到一个令人困惑的现象&#xff1a;明明设置了高优先级任务&#xff0c;但系统运行时低优先级任务却先执行。这种情况在从其他RT…...

cube studio开源一站式云原生机器学习平台--pytorch分布式训练

全栈工程师开发手册 &#xff08;作者&#xff1a;栾鹏&#xff09; 一站式云原生机器学习平台 前言 开源地址&#xff1a;https://github.com/data-infra/cube-studio cube studio 开源的国内最热门的一站式机器学习mlops/大模型训练平台&#xff0c;支持多租户&#xff0c…...

手把手拆解FD-SOI工艺流程:从SOI衬底到应变硅外延的保姆级图解

从SOI衬底到应变硅外延&#xff1a;FD-SOI工艺全流程拆解指南 想象一下建造一座微型城市&#xff0c;每一栋建筑只有头发丝直径的万分之一大小。这就是FD-SOI工艺工程师的日常工作——在硅片上用原子级精度"建造"晶体管。与传统的体硅工艺不同&#xff0c;FD-SOI&…...

C 读取RAW文件程序

C# 读取RAW文件程序 【下载地址】C读取RAW文件程序 本仓库提供了一个简单的C#程序&#xff0c;用于读取RAW文件。该程序已经过调试&#xff0c;确保功能正常运行。需要注意的是&#xff0c;此程序仅提供基本的RAW文件读取功能&#xff0c;不包含任何图像处理或转换功能 项目地…...

JetBrains IDE试用期重置终极指南:如何免费延长30天评估期

JetBrains IDE试用期重置终极指南&#xff1a;如何免费延长30天评估期 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter JetBrains IDE试用期重置工具&#xff08;ide-eval-resetter&#xff09;是一款专业的开源解…...

告别跑飞!S32K3xx Standby模式唤醒后程序复位?手把手教你用WKPU和RTC保留关键数据

S32K3xx低功耗实战&#xff1a;WKPU与RTC协同解决Standby模式数据丢失难题 引言 在嵌入式系统设计中&#xff0c;低功耗优化一直是工程师们面临的永恒挑战。S32K3xx系列微控制器凭借其出色的电源管理能力&#xff0c;成为汽车电子、工业控制等领域的热门选择。然而&#xff0c;…...