首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Draft.js中使用修饰符修饰文本

如何在Draft.js中使用修饰符修饰文本
EN

Stack Overflow用户
提问于 2018-07-05 23:45:54
回答 1查看 1.4K关注 0票数 1

我正在尝试修饰一些文本,但它应该是ajax调用的结果,以指定要修饰的文本部分,而不是使用正则表达式策略来管理进程。可以使用修饰符库中的任何方法吗?我的想法是在onChange方法内部调用一些东西并修改editorstate。任何想法都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2018-08-04 03:49:14

我的解决方案使用了一个自定义装饰器和一个动态正则表达式,这种组合可能有助于实现您所希望的效果。

代码结构遵循this示例来装饰draftjs中的tweet。

您可以使用ajax调用替换代码中的字符串数组(var arr = "one","two","three")。

代码语言:javascript
复制
import React, { Component } from 'react';
import { Editor, EditorState, CompositeDecorator } from 'draft-js';

const styles = {
  handle: {
    color: 'black',
    backgroundColor: '#FF7F7F',
    direction: 'ltr',
    unicodeBidi: 'bidi-override',
  },
};

// arr can be accessed from an ajax call
var arr = ["one", "two", "three"]
const HANDLE_REGEX = new RegExp("(?:[\\s]|^)(" + arr.join("|") + ")(?=[\\s]|$)", 'gi')

function handleStrategy(contentBlock, callback, contentState) {
  findWithRegex(HANDLE_REGEX, contentBlock, callback);
}

function findWithRegex(regex, contentBlock, callback) {
  const text = contentBlock.getText();
  let matchArr, start;
  while ((matchArr = regex.exec(text)) !== null) {
    start = matchArr.index;
    callback(start, start + matchArr[0].length);
  }
}
const HandleSpan = (props) => {
  return (
    <span
      style={styles.handle}      
      data-offset-key={props.offsetKey}
    >
      {props.children}
    </span>
  );
};


class App extends Component {
  constructor(props) {
    super(props);
    const compositeDecorator = new CompositeDecorator([
      {
        strategy: handleStrategy,
        component: HandleSpan,
      }
    ]);
    this.state = {
      editorState: EditorState.createEmpty(compositeDecorator),
    };
    this.onChange = (editorState) => this.setState({editorState});
  }
  render() {
    return (
      <div className="container-root">
      <Editor
        editorState={this.state.editorState}
        onChange={this.onChange}
        placeholder="Write..."
        ref="editor"
        spellCheck={true}
      />
      </div>
    );
  }
}

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

https://stackoverflow.com/questions/51195426

复制
相关文章

相似问题

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