我用 60 行代码重构了 Cmd-K 命令面板
像 Linear、Raycast 和 VS Code 这样的应用都使用了命令面板。你按下 ⌘K,输入几个字母,然后按回车。它看起来很复杂,但实际上只需要 60 行 JavaScript 代码。
以下是构建方法:
- 键盘监听器
你需要一个全局监听器。浏览器使用 Ctrl+K 进行搜索,你必须使用
preventDefault来阻止这一行为。
document.addEventListener("keydown", e => {
if ((e.metaKey || e.ctrlKey) && e.key === "k") {
e.preventDefault();
openPalette();
}
});
- 命令数据 将每个操作存储为一个对象。UI 保持简洁:它列出这些对象并运行你选择的函数。添加新功能只需在列表中增加一行。
const COMMANDS = [
{ icon: "🌙", label: "Toggle dark mode", group: "Theme", run: toggleDark },
{ icon: "📄", label: "New file", group: "File", run: newFile },
];
- 模糊搜索 优秀的命令面板使用子序列匹配(subsequence matching)。这意味着字符必须按顺序出现,但不一定需要相邻。输入 "tgldk" 应该能找到 "Toggle dark mode"。
function fuzzy(q, text) {
let i = 0;
for (const ch of text.toLowerCase()) {
if (ch === q[i]) i++;
}
return i === q.length;
}
键盘导航 目标是摆脱鼠标。使用方向键更改选中索引,使用 Enter 键运行命令,使用 Escape 键关闭菜单。
即时感 在面板打开的一瞬间,立即让输入框获取焦点。这样你就可以直接输入而无需点击。
一个命令面板需要四样东西:
- 全局快捷键
- 命令数据
- 模糊过滤器
- 自动聚焦
动手实现一次,你就能理解现代高级用户工具的工作原理。
在线体验:https://dev48v.infy.uk/design/day10-command-palette.html
来源:https://dev.to/dev48v/i-rebuilt-the-cmd-k-command-palette-in-60-lines-of-javascript-3a1l