在返回(或Map)javascript+react之后添加类

wfveoks0  于 2021-09-13  发布在  Java
关注(0)|答案(2)|浏览(220)

我试图在返回一张Map后添加一个类,基本上我试图在翻译每个单词后突出显示文本,我这样做是通过添加一个css类。我可以添加类,但只是添加到整个框中,而不是我更改的词,我尝试了许多方法,但我猜我不太理解函数,我尝试了matchall,也尝试了将它们替换为以前的方法,并尝试直接设置样式,但我仍然无法实现,我还尝试在“return”之后添加函数,但是javascript在调用return时结束函数的执行/
谢谢你的时间!

export default function Text() {

    var inputText;
    var mapObj = { blue: "azul", green: "verde", yellow: "amarillo" };

    function changeText() {
      inputText = document.querySelector("#inputF");
      document.getElementById("outputF").innerHTML = inputText.value.replaceAll(/\b(blue|green|yellow)\b(|,.$)/gi,
      function(matched){
      return mapObj[matched];
    })
    outputF.classList.add("mark");
    }
return (
    <div>
          <textarea id="inputF"></textarea>
          <button onClick={changeText}>Change</button>
          <textarea id="outputF"></textarea>   
    </div>
  );
};

///CSS

.mark{
  background-color:blue;}
gev0vcfq

gev0vcfq1#

我建议在这里使用more react而不是本机js,特别是对于该组件的状态管理,我可能有点过火,但我将您的组件更新为以下内容:

const Text = () => {
  const [input, setInput] = React.useState('');
  const [output, setOutput] = React.useState('');
  const mapObj = {
    blue: "azul", 
    green: "verde", 
    yellow: "amarillo" 
  };

  const changeText = (e) => {
    e.preventDefault();
    const changedText = input.replaceAll(
      /\b(blue|green|yellow)\b(|,.$)/gi,
      (matched) => `<span class="mark">${mapObj[matched]}</span>`
    )
    setOutput(changedText);
  }
  return (
    <form>
      <textarea 
        id="inputF" 
        value={input} 
        onChange={(e) => setInput(e.target.value)}
      />
      <button type="submit" onClick={changeText}>Change</button> 
      <div 
        id="outputF"
        dangerouslySetInnerHTML={{__html: output}}
      />
    </form>
  );
};

小提琴:https://jsfiddle.net/3tc2xzms/
首先,我加了2 useState 钩子来管理输入和输出文本。然后对于突出显示部分,每个被更改的匹配单词都被 Package 在一个 span.mark . 输出文本区域也被更改为div。
相关文件:
形式:https://reactjs.org/docs/forms.html
州钩:https://reactjs.org/docs/hooks-state.html
将字符串设置为html:https://reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml

bmvo0sr5

bmvo0sr52#

应用的样式将更改整个场景的背景色 textarea ,你可以做的是使用 setSelectionRange() textarea的方法,这将使您得到接近预期的结果。

function changeText() {
      inputText = document.querySelector("#inputF");
      document.getElementById("outputF").innerHTML = inputText.value.replaceAll(/\b(blue|green|yellow)\b(|,.$)/gi,
      function(matched){
      return mapObj[matched];
    })
    // something like this
    // here you need to set start and end index for the highlights part, you can use the logic as per need
    outputF.setSelectionRange(0, inputText.value.length )
    }

要更改突出显示颜色,可以使用以下css:

::selection {
  color: red;
  background: yellow;
}

::-moz-selection { /* Code for Firefox */
  color: red;
  background: yellow;
}

相关问题