antd 快捷键录制组件来了(社区版

一切始于公司 Electron 项目对用户自定义快捷键功能的需求。

起初,UI 端的快捷键逻辑采用的是裸写方式实现,随后交由另一位同事重构,并利用 react-hotkeys-hook 进行快捷键记录和功能绑定。

然而,在实际操作过程中,接手的同事反馈快捷键记录编写颇为棘手。出于兴趣,我在业余时间也着手研究并开发了这一组件。

核心功能

  1. 预设快捷键组合 :至少包含一个修饰键与一个常规按键,例如:Ctrl + C, Shift + Enter, Ctrl + Shift + Del
    1. 常规按键支持 a-z、F1-F12 及一些特殊键,详细列表参见 github/useRecordHotkey.ts
  2. 确认快捷键: 按下回车键确认当前录入的快捷键组合并停止录制
  3. 取消录制: 按下 ESC 键可随时取消快捷键的录制过程

基本使用方法

集成 antd 样式的组件

若您的项目已引入 antd 组件库,可以直接安装 antd-record-hotkey-input, 以便快速应用:

tsx 复制代码
import RecordShortcutInput from 'antd-record-hotkey-input';

export default () => <RecordShortcutInput />;

如果默认 UI 交互不完全满足业务需求,可以从 antd-record-hotkey-input 中导入 useRecordHotkey hook 实现自定义。

hook 版本

上述 antd-record-hotkey-input 所导出的 useRecordHotkey hook 同样可通过安装 react-use-record-hotkey 进行直接导入。以下是一个 hook 使用示例:

tsx 复制代码
import { useRecordHotkey } from 'react-use-record-hotkey';

const App = () => {
  const [inputRef, keys, { start, stop, isRecording }] = useRecordHotkey({
    onClean: () => {
      console.log('Clean');
    },
    onConfirm: (hotkey) => {
      console.log(`Hotkey: ${Array.from(hotkey).join('+')}`);
    },
  });

  const hotkey = Array.from(keys).join('+');

  return (
    <div>
      <input ref={inputRef} autoFocus readOnly value={hotkey} />
      <button onClick={start}>Start</button>
      <button onClick={stop}>Stop</button>
      <p>Recording: {isRecording ? 'Yes' : 'No'}</p>
      <p>Hotkey: {hotkey}</p>
    </div>
  );
};

export default App;

应用快捷键

通过组件或 hook 录制到的快捷键,可以方便地结合 react-hotkeys-hook 来实现相应的快捷键功能。以下是一个简单示例:

tsx 复制代码
import { useState } from 'react';
import { Empty, message } from 'antd';
import RecordShortcutInput from 'antd-record-hotkey-input';
import { useHotkeys } from 'react-hotkeys-hook';

const App = () => {
  const [shortcut, setShortcut] = useState('Shift + F5');

  const shortRef = useHotkeys<HTMLDivElement>(
    shortcut,
    () => {
      message.success('快捷键触发');
    },
    { preventDefault: true},
  );

  return (
    <>
      <RecordShortcutInput
        allowClear
        style={{ width: 500 }}
        defaultValue={shortcut}
        onConfirm={setShortcut}
      />

      <div tabIndex={-1} ref={shortRef}>
        {shortcut ? <span>点击聚焦,测试快捷键:{shortcut}</span> : <Empty />}
      </div>
    </>
  );
};

以上即为该组件的基本使用方法。如您对此感兴趣,请移步至 GitHub - react-record-hotkey。如果可以帮助到你,可以点个 star 😘。

组件库开发小技巧

monorepo 实践

  1. 在此类项目中,由于需要同时维护一个 hook 版本和一个 UI 组件版本,monorepo 架构无疑是最优选择,同时还能方便地添加 example 测试项目等。
  2. 利用 GitHub Action 和 semantic-release 实现自动化的包发布流程。

巧妙运用软链接

鉴于 antd-record-hotkey-input 基础上仅采用了 antd 的 input 组件,理论上应同时支持 antd4 和 antd5。因此,我们只需在 antd example 中编写一遍代码,然后通过 脚本创建软连接同步 即可。

文档引用

文档部分采用 dumi 编写,针对代码示例部分,我们借助了 dumi-plugin-code-snippets 插件实现在本地插入代码片段的功能,避免了重复编写示例片段的繁琐步骤。

相关推荐
曦樂~7 小时前
【Web Development】02 CSS
前端·css
风骏时光牛马7 小时前
后端服务接口开发与数据逻辑处理
前端
东鹏特饮7 小时前
经典打砖块(Breakout)游戏
前端·css·css3
IT_陈寒7 小时前
Vite的HMR把我整不会了:一个生产环境的热更新坑
前端·人工智能·后端
Mh7 小时前
如何使用双缓冲优化视频切换
前端
Highcharts.js8 小时前
Highcharts Orbit 完全指南:把每一张图表变成交互式分析工具
react.js·前端框架·highcharts·orbit·使用指南·ai 图表·交互式分析工具
risenav8 小时前
低头蓄力,抬头起跳:《萤虫跳跳》的 Rokid AIUI 开发实战
前端
ZhengEnCi8 小时前
如何看待 Fable 5.2 用纯代码生成 1.4MB 视觉作品:光追、水面、倒影、火光的程序化生成原理
前端
再吃一根胡萝卜9 小时前
DSH 插件的 Host 与 Client:为什么「只加载了 Host」,以及要不要自己写 Client 加载器
前端
parade岁月9 小时前
AI 写的前端代码为什么总像 5 年前的?Chrome 官方出手了
前端