首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未在React中使用Slate.js编辑器的输入和回退空间

未在React中使用Slate.js编辑器的输入和回退空间
EN

Stack Overflow用户
提问于 2019-05-10 16:40:12
回答 1查看 2.6K关注 0票数 0

我正在为一个应用程序实现一个文本编辑器,并试图添加一些热键,用于快速编辑,如、粗体、和斜体。由于某种原因,在我实现了我的onKeyDown侦听器来呈现我的格式化文本、我的后置空间和输入按钮之后,它就不再工作了。当键位于后退空间或enter时,onChange处理程序不会被触发,但是对于其他每个键都会被触发。下面是我的代码。

TextEditor.js

代码语言:javascript
复制
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;

我正在学习本教程https://www.strilliant.com/2018/07/15/let%E2%80%99s-build-a-fast-slick-and-customizable-rich-text-editor-with-slate-js-and-react/

我似乎找不到我做了什么不同的工作,我想知道是否有一个改变的板岩/反应,是阻碍了我所遵循的代码按预期工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-13 15:10:10

对于使用同一教程并有此问题的任何人,我将参考Slate.js的docs

https://docs.slatejs.org/walkthroughs/adding-event-handlers

Correct code

代码语言:javascript
复制
  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;
      }
    }
  }

State2.0反对change,现在使用editor。如果没有按热键(在我的示例控件中),请确保声明next参数,并在返回时调用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56081674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档