id: advanced-topics-key-bindings

title: 键绑定

Editor组件可通过keyBindingFn属性灵活地为您的编辑器定义自定义键绑定。 这使您可以将关键命令与编辑器组件中的行为进行匹配。

Defaults

默认的键绑定函数是getDefaultKeyBinding

由于Draft框架保持对DOM渲染和行为的严格控制,因此必须捕获基本的编辑命令并通过键绑定系统进行路由。

getDefaultKeyBinding将已知的OS级编辑器命令映射到DraftEditorCommand字符串,然后这些字符串与组件处理程序中的行为相对应。

例如,Ctrl + Z(Win)Cmd + Z(OSX)映射到'undo'命令,该命令随后路由我们的处理程序以执行EditorState.undo()

定制化

您可以提供自己的键绑定函数以提供自定义命令字符串。

建议您将函数使用getDefaultKeyBinding作为替代情况,以便您的编辑器可以从默认命令中受益。

使用自定义命令字符串,然后可以实现handleKeyCommand prop函数,该函数允许您将该命令字符串映射到所需的行为。 如果handleKeyCommand返回“handled”,则该命令被视为已处理。 如果返回'not-handled',该命令被视为未处理。

例子

假设我们有一个编辑器,该编辑器应具有“保存”机制,以将您的内容作为draft副本定期写入服务器,类似于medium的编辑器。

首先,让我们定义键绑定函数:

  1. import {getDefaultKeyBinding, KeyBindingUtil} from 'draft-js';
  2. const {hasCommandModifier} = KeyBindingUtil;
  3. function myKeyBindingFn(e: SyntheticKeyboardEvent): string {
  4. if (e.keyCode === 83 /* `S` key */ && hasCommandModifier(e)) {
  5. return 'myeditor-save';
  6. }
  7. return getDefaultKeyBinding(e);
  8. }

我们的函数收到一个键事件,然后检查它是否符合我们的条件:它必须是S键,并且必须具有命令修饰符,即OSX的命令键,否则为控制键。

如果命令匹配,则返回一个字符串,命名该命令。 否则,请使用默认的键绑定。

然后,在我们的编辑器组件中,我们可以通过handleKeyCommand属性使用命令:

  1. import {Editor} from 'draft-js';
  2. class MyEditor extends React.Component {
  3. constructor(props) {
  4. super(props);
  5. this.handleKeyCommand = this.handleKeyCommand.bind(this);
  6. }
  7. // ...
  8. handleKeyCommand(command: string): DraftHandleValue {
  9. if (command === 'myeditor-save') {
  10. // 执行请求以保存您的内容,设置
  11. //一个新的`editorState`等。
  12. return 'handled';
  13. }
  14. return 'not-handled';
  15. }
  16. render() {
  17. return (
  18. <Editor
  19. editorState={this.state.editorState}
  20. handleKeyCommand={this.handleKeyCommand}
  21. keyBindingFn={myKeyBindingFn}
  22. ...
  23. />
  24. );
  25. }
  26. }

myeditor-save命令可用于我们的自定义行为,返回“handled”将指示编辑器该命令已被处理,无需进行其他工作。

通过在所有其他情况下返回'not-handled',默认命令可以进入默认处理程序行为。