Enter 和 Backspace 不适用于 React 中的 Slate.js 编辑器
Enter and Backspace not working with Slate.js editor in React
我正在为应用程序实现一个文本编辑器,并尝试添加一些热键以进行快速编辑,例如 粗体 和 斜体 。出于某种原因,在我实现我的 onKeyDown 侦听器以呈现我的格式化文本后,我的退格键和输入按钮不再起作用。 onChange
处理程序不会在键为退格键或回车键时触发,但会在每隔一个键时触发。下面是我的代码。
TextEditor.js
import React, { Component, Fragment } from 'react';
import { Editor } from 'slate-react';
import { Value } from 'slate';
import Icon from 'react-icons-kit';
import { bold } from 'react-icons-kit/feather/bold';
import { italic } from 'react-icons-kit/feather/italic';
import { BoldMark, ItalicMark } from './TextComponents/index';
import FormatToolbar from './FormatToolbar/FormatToolbar';
const initialValue = Value.fromJSON({
document: {
nodes: [
{
object: 'block',
type: 'paragraph',
nodes: [
{
object: 'text',
text: 'My first paragraph!'
},
],
},
],
}
});
class TextEditor extends Component {
state = {
value: initialValue
}
onKeyDown = (e, change) => {
if (!e.ctrlKey) {
console.log('[I am not a control key]');
return;
}
e.preventDefault();
console.log('[e key]', e.key);
switch (e.key) {
case 'b': {
change.toggleMark('bold');
return true;
}
case 'i': {
change.toggleMark('italic');
return true;
}
default: {
return false;
}
}
}
renderMark = props => {
const { type } = props.mark;
switch (type) {
case 'bold':
return <BoldMark {...props} />;
case 'italic':
return <ItalicMark {...props} />;
default:
return null;
}
}
onChange = ({ value }) => {
console.log('[on change]');
this.setState({
value
});
}
render () {
const { value } = this.state;
return (
<Fragment>
<FormatToolbar>
<button type="button" className="tooltip-icon-button">
<Icon icon={bold} />
</button>
<button type="button" className="tooltip-icon-button">
<Icon icon={italic} />
</button>
</FormatToolbar>
<Editor
value={value}
onKeyDown={this.onKeyDown}
onChange={this.onChange}
renderMark={this.renderMark}
/>
</Fragment>
);
}
}
export default TextEditor;
我似乎无法找到我所做的不同之处,我想知道 slate/react 是否有更改阻止我遵循的代码按预期工作。
对于使用相同教程并遇到此问题的任何人,我会参考 Slate.js
的文档
https://docs.slatejs.org/walkthroughs/adding-event-handlers
Correct code
onKeyDown = (e, editor, next) => {
if (!e.ctrlKey) {
return next();
}
e.preventDefault();
switch (e.key) {
case 'b': {
editor.toggleMark('bold');
return true;
}
case 'i': {
editor.toggleMark('italic');
return true;
}
default: {
return false;
}
}
}
Slate 2.0 已弃用 change
,现在使用 editor
。确保声明 next
参数并在你的 return 上调用它,如果你的热键没有被按下(在我的例子中是控制)。
我正在为应用程序实现一个文本编辑器,并尝试添加一些热键以进行快速编辑,例如 粗体 和 斜体 。出于某种原因,在我实现我的 onKeyDown 侦听器以呈现我的格式化文本后,我的退格键和输入按钮不再起作用。 onChange
处理程序不会在键为退格键或回车键时触发,但会在每隔一个键时触发。下面是我的代码。
TextEditor.js
import React, { Component, Fragment } from 'react';
import { Editor } from 'slate-react';
import { Value } from 'slate';
import Icon from 'react-icons-kit';
import { bold } from 'react-icons-kit/feather/bold';
import { italic } from 'react-icons-kit/feather/italic';
import { BoldMark, ItalicMark } from './TextComponents/index';
import FormatToolbar from './FormatToolbar/FormatToolbar';
const initialValue = Value.fromJSON({
document: {
nodes: [
{
object: 'block',
type: 'paragraph',
nodes: [
{
object: 'text',
text: 'My first paragraph!'
},
],
},
],
}
});
class TextEditor extends Component {
state = {
value: initialValue
}
onKeyDown = (e, change) => {
if (!e.ctrlKey) {
console.log('[I am not a control key]');
return;
}
e.preventDefault();
console.log('[e key]', e.key);
switch (e.key) {
case 'b': {
change.toggleMark('bold');
return true;
}
case 'i': {
change.toggleMark('italic');
return true;
}
default: {
return false;
}
}
}
renderMark = props => {
const { type } = props.mark;
switch (type) {
case 'bold':
return <BoldMark {...props} />;
case 'italic':
return <ItalicMark {...props} />;
default:
return null;
}
}
onChange = ({ value }) => {
console.log('[on change]');
this.setState({
value
});
}
render () {
const { value } = this.state;
return (
<Fragment>
<FormatToolbar>
<button type="button" className="tooltip-icon-button">
<Icon icon={bold} />
</button>
<button type="button" className="tooltip-icon-button">
<Icon icon={italic} />
</button>
</FormatToolbar>
<Editor
value={value}
onKeyDown={this.onKeyDown}
onChange={this.onChange}
renderMark={this.renderMark}
/>
</Fragment>
);
}
}
export default TextEditor;
我似乎无法找到我所做的不同之处,我想知道 slate/react 是否有更改阻止我遵循的代码按预期工作。
对于使用相同教程并遇到此问题的任何人,我会参考 Slate.js
的文档https://docs.slatejs.org/walkthroughs/adding-event-handlers
Correct code
onKeyDown = (e, editor, next) => {
if (!e.ctrlKey) {
return next();
}
e.preventDefault();
switch (e.key) {
case 'b': {
editor.toggleMark('bold');
return true;
}
case 'i': {
editor.toggleMark('italic');
return true;
}
default: {
return false;
}
}
}
Slate 2.0 已弃用 change
,现在使用 editor
。确保声明 next
参数并在你的 return 上调用它,如果你的热键没有被按下(在我的例子中是控制)。