Slate.js 入门(二)- 添加事件绑定

1,083 阅读2分钟

我正在参加「掘金·启航计划」

Slate 的事件处理

上一篇我们通过 Slate 实现了一个简单的富文本编辑器,有兴趣的小伙伴点击查看。本篇我们来聊一聊 Slate 的事件绑定。

从 onKeydown 事件开始

Slate 是十分强大的编辑器组件,当然,它也可以添加某些常见的事件绑定,比如监听键盘键入事件 onKeyDown

<Editable
    onKeyDown={(event) => {
        console.log(event.key);
    }}
/>

效果如下,我们可以看到,Slate 确实能够实时监听用户的键盘输入动作:

2022-09-20-16-45-13.gif

通常我们利用绑定事件做得最多的就是,改变用户的输入,替换默认的输出结果。比如,当用户输入 & 符号时,我们在富文本中将其替换为 and

这里需要注意的是,event.preventDefault() 的作用,如果删除这段代码,那么当用户输入 & 符号时,系统会默认输出 &,此时结果显示为 &and,这并不是我们想要的,所以利用 preventDefault() 方法来阻止 & 的默认输出。

<Editable
    onKeyDown={event => {
        if (event.key === '&') {
            // 阻止键盘的默认事件,即 & 符号的插入
            event.preventDefault()
            editor.insertText('and')
        }
    }}
/>

效果如下,当我们尝试输入 & 符号时,你就会看到 and 代替了它:

2022-09-20-16-56-22.gif

自定义事件

如果你引入的是 slate-reactEditable,那么除了 onKeyDown,它还支持其他事件的监听,比如复制 onCopy、粘连 onPaste、拖放 onDrop 等等...

在一些情况下,如果你想拓展或覆盖 Slate 编辑器的默认事件,你可以通过在 Editable 组件中添加自定义事件来实现

你可以通过自定义事件的返回值来控制 Slate 是否要执行自身的默认事件程序

import {Editable} from 'slate-react';
/**
实现自定义事件逻辑...
**/function MyEditor() {
    const onClick = event => {
        // 当没有返回值,并且没有设置 preventDefault 和 stopPropagation 时,Slate 将执行自带的事件处理程序
    };
​
    const onDrop = event => {
        // 如果返回 true,Slate 将认为该事件已被处理,不会执行自身的事件处理程序
        return true;
    };
​
    const onDragStart = event => {
        // 如果返回 false,Slate 会认为事件还未被处理,之后 Slate 将执行自身的事件处理程序
        return false;
    };
​
    return (
        <Editable
            onClick={onClick}
            onDrop={onDrop}
            onDragStart={onDragStart}
        />
    )
}

这个事件返回值机制有一点难理解,没事,我们举个例子你就明白了~

就拿 onDrop 事件来说,我们自定义该事件并返回 true 时,默认情况下,当图片拖放至富文本编辑器时,它会默认打开拖放的图片,效果如下:

2022-09-21-11-35-17.gif

当我们返回 false 时,也就是跳过 onDrop 本身的默认事件处理,这样就不会打开图片了,效果如下:

2022-09-21-11-36-24.gif

写在最后

事件处理机制的灵活性进一步增加了 Slate 的拓展性,当富文本编辑器趋于复杂时,我们就经常需要对富文本的一些常见事件进行改写、覆盖和拓展,这些机制使我们的开发便捷了许多。

参考

docs.slatejs.org/