1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-02-26 10:12:32 +01:00

176 lines
5.9 KiB
Markdown
Raw Normal View History

2016-07-12 10:36:55 -07:00
# Plugins
2016-07-12 10:33:35 -07:00
Plugins can be attached to an editor to alter its behavior in different ways. Each editor has a "stack" of plugins, which has a specific order, which it runs through when certain hooks are triggered.
2016-07-12 10:33:35 -07:00
Plugins are plain JavaScript objects, containing a set of middleware functions that run for each hook they choose to implement.
2016-07-12 10:33:35 -07:00
## Hooks
2016-07-12 10:33:35 -07:00
In addition to the [core plugin hooks](../slate/plugins.md), when using `slate-react` there are additional browser-specific event handling hooks, and React-specific rendering hooks available to plugins.
2016-07-12 10:33:35 -07:00
```js
{
decorateNode: Function,
2016-07-12 10:33:35 -07:00
onBeforeInput: Function,
2016-07-27 22:45:25 -07:00
onBlur: Function,
onCopy: Function,
onCut: Function,
2016-07-22 17:15:46 -07:00
onDrop: Function,
onFocus: Function,
2016-07-12 10:33:35 -07:00
onKeyDown: Function,
onKeyUp: Function,
2016-07-27 22:45:25 -07:00
onPaste: Function,
onSelect: Function,
renderEditor: Function,
renderMark: Function,
renderNode: Function,
renderPlaceholder: Function,
shouldNodeComponentUpdate: Function,
2016-07-12 10:33:35 -07:00
}
```
The event hooks have a signature of `(event, change, next)`—the `event` is a React object that you are used to from React's event handlers.
2016-07-12 10:36:55 -07:00
The rendering hooks are just like render props common to other React API's, and receive `(props, next)`. For more information, see the [Rendering](./rendering.md) reference.
### `decorateNode`
`Function decorateNode(node: Node, next: Function) => Array<Decoration>|Void`
The `decorateNode` hook takes a `node` and returns an array of decorations with marks to be applied to the node when it is rendered.
2016-07-12 10:36:55 -07:00
### `onBeforeInput`
`Function onBeforeInput(event: Event, change: Change, next: Function) => Boolean`
2016-07-12 10:33:35 -07:00
2016-07-27 22:45:25 -07:00
This handler is called right before a string of text is inserted into the `contenteditable` element.
2016-07-12 10:33:35 -07:00
Make sure to `event.preventDefault()` if you do not want the default insertion behavior to occur!
2016-07-12 10:33:35 -07:00
2016-07-27 22:45:25 -07:00
### `onBlur`
`Function onBlur(event: Event, change: Change, next: Function) => Boolean`
2016-07-27 22:45:25 -07:00
This handler is called when the editor's `contenteditable` element is blurred.
2016-07-27 22:45:25 -07:00
### `onFocus`
`Function onFocus(event: Event, change: Change, next: Function) => Boolean`
This handler is called when the editor's `contenteditable` element is focused.
2016-07-27 22:45:25 -07:00
### `onCopy`
`Function onCopy(event: Event, change: Change, next: Function) => Boolean`
2016-07-27 22:45:25 -07:00
This handler is called when there is a copy event in the editor's `contenteditable` element.
2016-07-27 22:45:25 -07:00
### `onCut`
`Function onCut(event: Event, change: Change, next: Function) => Boolean`
2016-07-27 22:45:25 -07:00
This handler is equivalent to the `onCopy` handler.
2016-07-27 22:45:25 -07:00
2016-07-22 17:15:46 -07:00
### `onDrop`
`Function onDrop(event: Event, change: Change, next: Function) => Boolean`
2016-07-22 17:15:46 -07:00
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.
2016-07-22 17:15:46 -07:00
### `onKeyDown`
`Function onKeyDown(event: Event, change: Change, next: Function) => Boolean`
2016-07-12 10:33:35 -07:00
2016-07-27 23:14:50 -07:00
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!
2016-07-12 10:33:35 -07:00
### `onKeyUp`
`Function onKeyUp(event: Event, change: Change, next: Function) => Boolean`
This handler is called when any key is released in the `contenteditable` element.
2016-07-12 11:17:59 -07:00
### `onPaste`
`Function onPaste(event: Event, change: Change, next: Function) => Boolean`
2016-07-12 10:33:35 -07:00
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.
2016-07-12 10:33:35 -07:00
2016-07-27 22:45:25 -07:00
### `onSelect`
`Function onSelect(event: Event, change: Change, next: Function) => Boolean`
2016-07-27 22:45:25 -07:00
This handler is called whenever the native DOM selection changes.
2016-07-27 22:45:25 -07:00
> 🤖 This is **not** Slate's internal selection representation. If you want to get notified when Slate's `value.selection` changes, use the [`onChange`](../slate-react/editor.md#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.
2016-07-12 10:33:35 -07:00
### `renderEditor`
2016-07-12 10:33:35 -07:00
`Function renderEditor(props: Object, next: Function) => 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 content to render.
### `renderMark`
`Function renderMark(props: Object, next: Function) => ReactNode|Void`
Render a `Mark` with `props`. The `props` object contains:
```js
{
attributes: Object,
children: ReactNode,
editor: Editor,
mark: Mark,
marks: Set<Mark>,
node: Node,
offset: Number,
text: String,
}
```
You must spread the `props.attributes` onto the top-level DOM node you use to render the mark.
### `renderNode`
`Function renderNode(props: Object, next: Function) => ReactNode|Void`
Render a `Node` with `props`. The `props` object contains:
```js
{
attributes: Object,
children: ReactNode,
editor: Editor,
isFocused: Boolean,
isSelected: BOolean,
node: Node,
parent: Node,
readOnly: Boolean,
}
```
You must spread the `props.attributes` onto the top-level DOM node you use to render the node.
### `renderPlaceholder`
`Function renderPlaceholder(props: Object, next: Function) => ReactNode|Void`
Render the placeholder that is shown when the editor has no `value`. The `props` object contains:
```js
{
editor: Editor,
readOnly: Boolean,
}
```
The `placeholder` prop that was passed to the editor can be found at `editor.props.placeholder`.
### `shouldNodeComponentUpdate`
`Function shouldNodeComponentUpdate(previousProps: Object, props: Object, next: Function) => Boolean|Void`
2016-08-14 15:58:41 -07:00
If this function returns `true`, it can force updating the node's component where otherwise it wouldn't for performance.