简体   繁体   English

React.js:contentEditable div 不呈现嵌套跨度元素

[英]React.js: contentEditable div not rendering nested span elements

I have a contentEditable div where I am trying to update the colors of words that the user types into it onChange.我有一个 contentEditable div,我试图在其中更新用户在 onChange 中输入的单词的 colors。 When I detect a word that I want to be colored, I wrap it in a <span> element.当我检测到一个想要着色的单词时,我将它包装在一个<span>元素中。

The issue is, the <span> elements aren't being properly rendered, and the raw HTML of the span elements are being displayed like this:问题是, <span>元素没有被正确渲染,并且 span 元素的原始 HTML 显示如下:

bla bla bla <span class="text-primary">keyword with color</span> bla bla bla . bla bla bla <span class="text-primary">keyword with color</span> bla bla bla .

How do I fix this?我该如何解决? Is this something to do with React?这与 React 有关吗?

This is the code I'm using to generate the text that goes inside the contentEditable div.这是我用来生成 contentEditable div 内的文本的代码。 I store the result in a variable in render() and directly pass it into the contentEditable div with {text} .我将结果存储在render()中的变量中,并使用{text}直接将其传递到 contentEditable div。

function formatDateKeywords(name, keyword) {
  var startIndex = name.indexOf(keyword);
  var endIndex = startIndex + keyword.length;
  var res =
    name.substring(0, startIndex) +
    "<span class='text-primary'>" +
    keyword +
    "</span>" +
    name.substring(endIndex, name.length);

  return res;
}

This is what the div looks like:这是 div 的样子:

<div
    contentEditable="true"
    suppressContentEditableWarning={true}
    id="addItemInput"
    data-placeholder={placeholder}
    className="form-control text-left editable"
    type="text"
    onInput={(e) => this.handleInput(e)}
    onKeyDown={(e) => this.keyPress(e)}
>
    {formattedText}
</div>

in reactjs you have to use JSX to add tag into content: i use React.Fragment to avoid adding unused tag.在 reactjs 中,您必须使用 JSX 将标签添加到内容中:我使用 React.Fragment 来避免添加未使用的标签。

function formatDateKeywords(name, keyword) {
  var startIndex = name.indexOf(keyword);
  var endIndex = startIndex + keyword.length;
  var res = <>
        {name.substring(0, startIndex)}
        <span class='text-primary'>{keyword}</span>
        {name.substring(endIndex, name.length)}
    </>;

  return res;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM