我正在构建使用markdown 内容的Reaction/Django应用程序,我想放一个搜索栏,用户可以在上面搜索博客内容,并突出显示与搜索结果匹配的单词.

我使用了Reaction-Highlight-Words库,但我发现它与标记内容不兼容,所以我try 使用Reaction-Strong-Replace库,但我在测试中遇到了一个问题

REACT-STRING-REPLACE返回数组而不是字符串,所以我try 使用一个钩子(UseState),它是一个空字符串,映射数组中的每个单词并将其附加到钩子中,然后将钩子放入ReactMarkdown元素中.

import React from 'react'
import ReactMarkdown from 'react-markdown'
import reactStringReplace from 'react-string-replace';
export default function Mark(){
   
   
    const [stringData, setStringData] = React.useState("");
    
    const content = 'Hey my number is 555-555-5555.';
   const replacearray= reactStringReplace(content, 's', (match, i) => (
        `===${match}===`
      ));
console.log(replacearray)
replacearray.map(word =>{
    console.log(word)
    setStringData(stringData + `${word}`)


})
console.log(stringData)
    return(
       <ReactMarkdown>{stringData}</ReactMarkdown>
    )
}

console.log(replacearray)的结果是:

  Array(3) [ "Hey my number i", "===s===", " 555-555-5555." ]

console.log(word)的结果是:

Hey my number i        mark.js:116:13
===s===                mark.js:116:13
 555-555-5555          mark.js:116:13

console.log(stringData)的结果是:

 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555. 555-555-5555.

那么,虽然每个单词的结果都是单词本身,但字符串数据的结果是这样的呢?

推荐答案

您使用的不是该州的current值,而是last值.这与Reaction处理状态更改的方式有关.在这里,您从空字符串""开始,最后得到555-555-555,因为这是replacearray的最后一个值.

您多次看到555-555-555的原因可能是因为缓存,当您执行硬刷新时,它将只有555-555-555.

export default function Mark() {
  const [stringData, setStringData] = React.useState("");

  replacearray.map((word) => {
    console.log(word);
    setStringData(stringData + `${word}`);
  });
}

相反,如果在循环中设置状态,则需要使用由setState函数提供的callback函数.这将返回当前/最新的值.

replacearray.map((word) => {
  console.log(word);
  setStringData((prevStringData) => {
    return prevStringData + word;
  });
});

或者你甚至可以使用.join()的方法.

setStringData(replacearray.join(""));

Javascript相关问答推荐

即使设置了父级的最大高度,固定位置的分区内容也不会滚动?

以逗号分隔的列表来数组并填充收件箱列表

如何比较嵌套对象的更改并创建更改报告

创建私有JS出口

JS生成具有给定数字和幻灯片计数的数组子集

如何才能拥有在jQuery终端中执行命令的链接?

模块与独立组件

我不知道为什么setwritten包装promise 不能像我预期的那样工作

在react js中使用react—router—dom中的Link组件,分配的右侧不能被 destruct ''

当试图显示小部件时,使用者会出现JavaScript错误.

在使用HighChats时如何避免Datatables重新初始化错误?

我创建了一个创建对象的函数,我希望从该函数创建的对象具有唯一的键.我怎么能做到这一点?

编辑文本无响应.onClick(扩展脚本)

使用带有HostBinding的Angular 信号来更新样式?

传递方法VS泛型对象VS事件特定对象

如何使本地html页面在重新加载时保持当前可隐藏部分的打开状态?

图表4-堆叠线和条形图之间的填充区域

如何根据查询结果重新排列日期

Angel Auth Guard-用户只有在未登录时才能访问登录页面,只有在登录时才能访问其他页面

需要刷新以查看Mern堆栈应用程序中的更改