Plugins
Plugins can be attached to an editor to alter its behavior in different ways. Plugins are just simple Javascript objects, containing a set of properties that control different behaviors—event handling, change handling, rendering, etc.
Each editor has a "middleware stack" of plugins, which has a specific order.
When the editor needs to resolve a plugin-related handler, it will loop through its plugin stack, searching for the first plugin that successfully returns a value. After receiving that value, the editor will not continue to search the remaining plugins; it returns early. If you'd like for the stack to continue, a plugin handler should return undefined
.
Conventions
A plugin should always export a function that takes options. This way even if it doesn't take any options now, it won't be a breaking API change to take more options in the future. So a basic plugin might look like this:
Event Handler Properties
All of the event handler properties are passed the same React event
object you are used to from React's event handlers. They are also passed a change
object representing any changes that have resulted from the event, and the editor
instance itself.
Each event handler can choose to call methods on the change
object, in which case the editor's value will be updated.
If the return value of a plugin handler is null
, the editor will simply continue resolving the plugin stack. However, if you return a non-null value, the editor will break out of the loop.
onBeforeInput
onBeforeInput
Function onBeforeInput(event: Event, change: Change, editor: Editor) => Change || Void
This handler is called right before a string of text is inserted into the contenteditable
element.
Make sure to event.preventDefault()
if you do not want the default insertion behavior to occur!
onBlur
onBlur
Function onBlur(event: Event, change: Change, editor: Editor) => Change || Void
This handler is called when the editor's contenteditable
element is blurred.
onFocus
onFocus
Function onFocus(event: Event, change: Change, editor: Editor) => Change || Void
This handler is called when the editor's contenteditable
element is focused.
onCopy
onCopy
Function onCopy(event: Event, change: Change, editor: Editor) => Change || Void
This handler is called when there is a copy event in the editor's contenteditable
element.
onCut
onCut
Function onCut(event: Event, change: Change, editor: Editor) => Change || Void
This handler is equivalent to the onCopy
handler.
onDrop
onDrop
Function onDrop(event: Event, change: Change, editor: Editor) => Change || Void
This handler is called when the user drops content into the contenteditable
element. The event is already prevented by default, so you must define a value change to have any affect occur.
onKeyDown
onKeyDown
Function onKeyDown(event: Event, change: Change, editor: Editor) => Change || Void
This handler is called when any key is pressed in the contenteditable
element, before any action is taken.
Make sure to event.preventDefault()
if you do not want the default insertion behavior to occur!
onKeyUp
onKeyUp
Function onKeyUp(event: Event, change: Change, editor: Editor) => Change || Void
This handler is called when any key is released in the contenteditable
element.
onPaste
onPaste
Function onPaste(event: Event, change: Change, editor: Editor) => Change || Void
This handler is called when the user pastes content into the contenteditable
element. The event is already prevented by default, so you must define a value change to have any affect occur.
onSelect
onSelect
Function onSelect(event: Event, change: Change, editor: Editor) => Change || Void
This handler is called whenever the native DOM selection changes.
Note: This is not Slate's internal selection representation (although it mirrors it). If you want to get notified when Slate's selection changes, use the onChange
property of the <Editor>
. This handler is instead meant to give you lower-level access to the DOM selection handling, which is not always triggered as you'd expect.
Slate-React Properties
onChange
onChange
Function onChange(change: Change, editor: Editor) => Any || Void
The onChange
handler isn't a native browser event handler. Instead, it is invoked whenever the editor value changes. This allows plugins to augment a change however they want.
shouldNodeComponentUpdate
shouldNodeComponentUpdate
Function shouldNodeComponentUpdate(previousEditorProps: Object, editorProps: Object) => true || Void
If this function returns true
, it can force updating the editor where otherwise it wouldn't.
Slate-React Rendering
These renderProps are used to create the Editor UI. They are called for each plugin in reverse plugin order (so the last plugin in the array is called first) and results are passed on as children
to the next plugin.
renderEditor
renderEditor
Function renderEditor(props: Object, editor: Editor) => ReactNode || Void
The renderEditor
property allows you to define higher-order-component-like behavior. It is passed all of the properties of the editor, including props.children
. You can then choose to wrap the existing children
in any custom elements or proxy the properties however you choose. This can be useful for rendering toolbars, styling the editor, rendering validation, etc. Remember that the renderEditor
function has to render props.children
for editor's children to render.
renderMark
renderMark
Function renderMark({ editor, mark, marks, node, offset, text, children, attributes }) => ReactNode || Void
Render a Mark
.
renderNode
renderNode
Function renderNode({ key, editor, isFocused, isSelected, node, parent, readOnly, children, attributes }) => ReactNode || Void
Render a Node
.
renderPlaceholder
renderPlaceholder
Function renderPlaceholder({ editor, mark, marks, node, offset, text, children, attributes }) => ReactNode || Void
Render the placeholder that is shown when the editor has no value
.
The placeholder
prop that was passed to the editor can be found at editor.props.placeholder
.
Other Properties
decorateNode
decorateNode
Function decorateNode(node: Node) => [Range] || Void
normalizeNode
normalizeNode
Function normalizeNode(node: Node) => Function(change: Change) || Void
schema
schema
Object
The schema
property allows you to define a set of rules that will be added to the editor's schema. The rules from each of the schemas returned by the plugins are collected into a single schema for the editor.
Last updated