使用Draftjs的简单撤消和重做按钮

问题描述 投票:1回答:3

我试图让一个简单的撤消和重做按钮工作开始。到目前为止,我已经尝试阅读draftjs网站上的文档,但感觉非常神秘,没有我想要做的例子。

这是我到目前为止所尝试的,点击撤消它什么都不做。不知道我错过了什么。提前致谢。

import React from 'react';
import ReactDOM from 'react-dom';
import {Editor, EditorState} from 'draft-js';

class MyEditor extends React.Component {
  constructor(props) {
    super(props);
    this.state = {editorState: EditorState.createEmpty()};
    this.onChange = (editorState) => this.setState({editorState});
  }

  onClick() {
    this.setState({
      editorState: EditorState.undo(editorState)
    })
  }

  render() {
    return (
      <div>
      <button onClick={this.onClick.bind(this)}>undo</button>
        <Editor editorState={this.state.editorState} onChange={this.onChange} />
        </div>
    );
  }
}

ReactDOM.render(
  <MyEditor />,
  document.getElementById('root')
);
javascript reactjs rich-text-editor draftjs
3个回答
2
投票

你已经找到了原因(你需要正确引用editorState变量),但我还是想在路上给你这个:

你应该改变你的onClick方法如下:

onClick() {
  this.setState({
    editorState: EditorState.undo(editorState)
  })
}

onClick() {
  this.onChange(EditorState.undo(this.state.editorState));
}

对于DraftJS,如果您尝试通过onChange以外的方法更改editorState,通常是“不好的做法”。

如果对editorState进行任何更改,只需在完成后触发onChange

另外,你知道草案JS插件吗?这是一个非常有用的DraftJS插件集,包括撤消/重做按钮!

https://www.draft-js-plugins.com/


2
投票

这是修复,我需要像这样正确引用editorstate,然后我根据Simon的回答重构:

import React from 'react';
import ReactDOM from 'react-dom';
import {Editor, EditorState} from 'draft-js';

class MyEditor extends React.Component {
  constructor(props) {
    super(props);
    this.state = {editorState: EditorState.createEmpty()};
    this.onChange = (editorState) => this.setState({editorState});
  }

  onUndo() {
    this.onChange(EditorState.undo(this.state.editorState));
  }

  onRedo() {
    this.onChange(EditorState.redo(this.state.editorState));
  }

  render() {
    return (
      <div>
      <button onClick={this.onUndo.bind(this)}>undo</button>
      <button onClick={this.onRedo.bind(this)}>Redo</button>
        <Editor editorState={this.state.editorState} onChange={this.onChange} />
        </div>
    );
  }
}

ReactDOM.render(
  <MyEditor />,
  document.getElementById('root')
);

0
投票

您可以轻松使用草稿团队提供的Undo / Redo插件

check it out please

© www.soinside.com 2019 - 2024. All rights reserved.