【问题标题】:the whole text gets cleared when trying to clear the selected word or character尝试清除所选单词或字符时,整个文本都会被清除
【发布时间】:2019-06-26 03:25:27
【问题描述】:

我正在使用带有 reactjs 的 Fabric js 将文本添加到画布。添加了文本,但是当我尝试清除字符或选定的单词时,整个文本都会被清除。我看到了一些与此相关的资源,但我使用的是 reactjs,所以很难为我解决这个问题。这是我的做法

class ImageBoard extends React.Component {
  constructor() {
    super();
    this.state = {
      selected: undefined
    };
  }

  handleDeleteKey = event => {
    if (event.keyCode === 46 || event.keyCode === 8) {
      event.preventDefault();
      if (this.state.selected !== undefined) {
        this.canvas.remove(this.state.selected);
        this.setState({ selected: undefined });
      }
    }
  };

  componentDidMount() {
    this.canvas = new fabric.Canvas("canvas");
    document.addEventListener("keydown", this.handleDeleteKey, false);
    this.canvas.on("object:selected", e =>
      this.setState({ selected: e.target })
    );
    this.canvas.on("selection:cleared", e =>
      this.setState({ selected: undefined })
    );
    this.canvas.setBackgroundColor(
      "rgba(255, 73, 64, 0.6)",
      this.canvas.renderAll.bind(this.canvas)
    );
  }

  componentDidUpdate(prevProps) {
    if (prevProps.images !== this.props.images) {
      this.setCanvasBackground(this.props.images, this.canvas);
    }
  }

  addText = () => {
    let text = new fabric.IText("Double click me to change the text!", {
      fontSize: 28,
      fontWeight: 600,
      left: 100,
      top: 100,
      fill: "black",
      width: 20,
      height: 20
    });
    this.canvas.add(text);
  };

  render() {
    return (
      <Wrapper>
        <Column width={80}>
          <canvas
            id="canvas"
            ref={el => (this.canvasEl = el)}
            width={580}
            height={400}
            className="z-depth-1"
          />
        </Column>
        <Filter
          addText={this.addText}
        />
      </Wrapper>
    );
  }
}

export default connect(mapStateToProps)(ImageBoard);

【问题讨论】:

    标签: javascript reactjs fabricjs


    【解决方案1】:

    由于您正在删除 delete/backspace 键处理程序中的选定对象,因此当您尝试使用 delete/backspace 清除文本字符时,整个文本都会被删除也就不足为奇了.条件检查if (this.state.selected !== undefined) 是不够的,因为当您进入文本编辑模式时,文本对象仍处于选中状态。

    但是,您可以另外检查 IText 的 isEditing 属性,以查看所选对象是否也处于编辑模式:

      handleDeleteKey = event => {
        if (event.keyCode === 46 || event.keyCode === 8) {
          if (this.state.selected !== undefined && !this.state.selected.isEditing) {
            event.preventDefault();
            this.canvas.remove(this.state.selected);
            this.setState({ selected: undefined });
          }
        }
      };
    

    这里有一个有效的 sn-p 来演示:

    class App extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          selected: undefined
        };
      }
    
      handleDeleteKey = event => {
        
        if (event.keyCode === 46 || event.keyCode === 8) {
          if (this.state.selected !== undefined && !this.state.selected.isEditing) {
            event.preventDefault();
            this.canvas.remove(this.state.selected);
            this.setState({ selected: undefined });
          }
        }
      };
    
      componentDidMount() {
        this.canvas = new fabric.Canvas("canvas");
        document.addEventListener("keydown", this.handleDeleteKey, false);
        this.canvas.on("object:selected", e =>
          this.setState({ selected: e.target })
        );
        this.canvas.on("selection:cleared", e =>
          this.setState({ selected: undefined })
        );
        this.canvas.setBackgroundColor(
          "rgba(255, 73, 64, 0.6)",
          this.canvas.renderAll.bind(this.canvas)
        );
      }
    
      addText = () => {
        let text = new fabric.IText("Double click me to change the text!", {
          fontSize: 28,
          fontWeight: 600,
          left: 20,
          top: 20,
          fill: "black",
          width: 20,
          height: 20
        });
        this.canvas.add(text);
      };
    
      render() {
        return (
          <div>
            <canvas
              id="canvas"
              ref={el => (this.canvasEl = el)}
              width={400}
              height={170}
            />
            <button onClick={this.addText}>
              add
            </button>
          </div>
        );
      }
    }
    
    ReactDOM.render(<App />, document.getElementById("app"));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.6.0/fabric.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
    <div id='app'></div>

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 2018-02-22
      • 2014-07-23
      相关资源
      最近更新 更多