如何在 draft.js 中创建自定义键绑定?
How to create custom key bindings in draft.js?
我按 CTRL+B
=> 我想将选定的文本加粗。
有用的链接:
http://facebook.github.io/draft-js/docs/advanced-topics-key-bindings.html#content - 描述了 keyBindingFn
和 handleKeyCommand
的作用。
https://github.com/facebook/draft-js/blob/master/examples/draft-0-10-0/rich/rich.html - 冗长的示例。
- https://www.youtube.com/watch?v=0k9suXgCtTA - 很棒的视频,解释了如何添加一个按钮来切换粗体。
我们需要将两个道具传递给我们的 <Editor/>
:
keyBindingFn
:将 CTRL + some key
映射到某些 动作刺痛
handleKeyCommand
:通过此 操作字符串 并决定如何处理它。
import React from 'react';
import {
Editor, EditorState,
RichUtils, getDefaultKeyBinding
} from 'draft-js';
class Problem extends React.Component {
constructor(props) {
super(props);
this.state = { editorState: EditorState.createEmpty() };
}
// this function maps keys we press to strings that represent some action (eg 'undo', or 'underline')
// then the this.handleKeyCommand('underline') function gets called with this string.
keyBindingFn = (event) => {
// we press CTRL + K => return 'bbbold'
// we use hasCommandModifier instead of checking for CTRL keyCode because different OSs have different command keys
if (KeyBindingUtil.hasCommandModifier(event) && event.keyCode === 75) { return 'bbbold'; }
// manages usual things, like:
// Ctrl+Z => return 'undo'
return getDefaultKeyBinding(event);
}
// command: string returned from this.keyBidingFn(event)
// if this function returns 'handled' string, all ends here.
// if it return 'not-handled', handling of :command will be delegated to Editor's default handling.
handleKeyCommand = (command) => {
let newState;
if (command === 'bbbold') {
newState = RichUtils.toggleInlineStyle(this.state.editorState, 'BOLD');
}
if (newState) {
this.setState({ editorState: newState });
return 'handled';
}
return 'not-handled';
}
render = () =>
<Editor
editorState={this.state.editorState}
onChange={(newState) => this.setState({ editorState: newState })}
handleKeyCommand={this.handleKeyCommand}
keyBindingFn={this.keyBindingFn}
/>
}
如果您想要的不是内联粗体文本 (RichUtils.toggleInlineStyle
),您可以使用 RichUtils.toggleBlockType
、RichUtils.toggleCode
、etc.
我按 CTRL+B
=> 我想将选定的文本加粗。
有用的链接:
http://facebook.github.io/draft-js/docs/advanced-topics-key-bindings.html#content - 描述了
keyBindingFn
和handleKeyCommand
的作用。https://github.com/facebook/draft-js/blob/master/examples/draft-0-10-0/rich/rich.html - 冗长的示例。
- https://www.youtube.com/watch?v=0k9suXgCtTA - 很棒的视频,解释了如何添加一个按钮来切换粗体。
我们需要将两个道具传递给我们的 <Editor/>
:
keyBindingFn
:将 CTRL + some key
映射到某些 动作刺痛
handleKeyCommand
:通过此 操作字符串 并决定如何处理它。
import React from 'react';
import {
Editor, EditorState,
RichUtils, getDefaultKeyBinding
} from 'draft-js';
class Problem extends React.Component {
constructor(props) {
super(props);
this.state = { editorState: EditorState.createEmpty() };
}
// this function maps keys we press to strings that represent some action (eg 'undo', or 'underline')
// then the this.handleKeyCommand('underline') function gets called with this string.
keyBindingFn = (event) => {
// we press CTRL + K => return 'bbbold'
// we use hasCommandModifier instead of checking for CTRL keyCode because different OSs have different command keys
if (KeyBindingUtil.hasCommandModifier(event) && event.keyCode === 75) { return 'bbbold'; }
// manages usual things, like:
// Ctrl+Z => return 'undo'
return getDefaultKeyBinding(event);
}
// command: string returned from this.keyBidingFn(event)
// if this function returns 'handled' string, all ends here.
// if it return 'not-handled', handling of :command will be delegated to Editor's default handling.
handleKeyCommand = (command) => {
let newState;
if (command === 'bbbold') {
newState = RichUtils.toggleInlineStyle(this.state.editorState, 'BOLD');
}
if (newState) {
this.setState({ editorState: newState });
return 'handled';
}
return 'not-handled';
}
render = () =>
<Editor
editorState={this.state.editorState}
onChange={(newState) => this.setState({ editorState: newState })}
handleKeyCommand={this.handleKeyCommand}
keyBindingFn={this.keyBindingFn}
/>
}
如果您想要的不是内联粗体文本 (RichUtils.toggleInlineStyle
),您可以使用 RichUtils.toggleBlockType
、RichUtils.toggleCode
、etc.