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 插件实现在本地插入代码片段的功能,避免了重复编写示例片段的繁琐步骤。

相关推荐
烬头88218 小时前
React Native鸿蒙跨平台实现二维码联系人APP(QRCodeContactApp)
javascript·react native·react.js·ecmascript·harmonyos
pas1368 小时前
40-mini-vue 实现三种联合类型
前端·javascript·vue.js
摇滚侠8 小时前
2 小时快速入门 ES6 基础视频教程
前端·ecmascript·es6
珑墨9 小时前
【Turbo】使用介绍
前端
军军君019 小时前
Three.js基础功能学习十三:太阳系实例上
前端·javascript·vue.js·学习·3d·前端框架·three
xiaoqi92210 小时前
React Native鸿蒙跨平台如何实现分类页面组件通过searchQuery状态变量管理搜索输入,实现了分类的实时过滤功能
javascript·react native·react.js·ecmascript·harmonyos
打小就很皮...11 小时前
Tesseract.js OCR 中文识别
前端·react.js·ocr
qq_1777673711 小时前
React Native鸿蒙跨平台实现应用介绍页,实现了应用信息卡片展示、特色功能网格布局、权限/联系信息陈列、评分展示、模态框详情交互等通用场景
javascript·react native·react.js·ecmascript·交互·harmonyos
wuhen_n11 小时前
JavaScript内存管理与执行上下文
前端·javascript
Hi_kenyon11 小时前
理解vue中的ref
前端·javascript·vue.js