【问题标题】:Highlighting issue for Search Text - React Native搜索文本的突出显示问题 - React Native
【发布时间】:2020-08-13 03:28:00
【问题描述】:

我有一个 React Native 应用程序,我有一个搜索栏和一个平面列表。当我在 SearchBar 中搜索某些内容时,必须在列表中突出显示文本。

单字符串搜索工作正常:

但是现在当我输入“访问时间”时,访问或时间都不会突出显示

我正在使用一个函数来突出显示文本。 SearchBar 值存储为 this.state.value ,我将其作为道具传递。 我在 Flatlist 的 renderItem 中使用的逻辑如下

getHighlightedText = text => {
  const {value} = this.props
  const parts = text.split(new RegExp(`(${value})`, 'gim'));
  console.log('split:', parts);
  return (
    <Text>{parts.map(part => (
      part.toLowerCase() === value.toLowerCase()) ?
        <Text style = {{backgroundColor: 'red'}}>{part}</Text> :
        part)}
    </Text>
  );
}
return <Text>{getHighlightedText(Desc)}</Text>;

当我搜索一个词时,这很好用。 例如,如果我的平面列表有 2 个项目 - “我的狗”和“她的猫”。 如果我的搜索文本是“狗”,那么“狗”会以红色突出显示。 但是,如果我搜索“M Dog”或“M D”,则不会突出显示任何内容。它必须突出字符而不是单词。请帮我修复代码!!!!!!

更新了我的代码

所以我将拆分搜索值,然后尝试突出显示每个搜索文本。如果我输入“访问时间”,它将分为“访问”和“小时”。 由于某种原因,循环仅针对“访问”而不是“小时”执行。我的代码中有一些错误。我只添加了一个 for 循环。请帮忙!!! :

getHighlightedText = text => {
  // search value is split and stored in val array. "list" and "hour"
  const val = value.split(' ');

  // below my item Description is split based on my search
  // terms "visit" n "hour" and then stored in vals array
  const vals = val.map(valu => {.
    var regex = new RegExp(`(${valu})`, 'gim');
    return text.split(regex);
  })

  // vals is merged into 1 array
  const merged = [].concat.apply([], vals);

  // below I am looping for each of my search text 1st
  // "visit" then "hour"         
  for (i = 0; i < val.length; i++) {
    const l = val[i];

    return (
      <Text>{merged.map(part => (
          part.toLowerCase() === l.toLowerCase()) ?
          <Text style = {{backgroundColor: 'red'}}>{part}</Text> :
          part
        )}
      </Text>
    );
  }
}

// using my getHighlightedText in my renderItem
return <Text>{getHighlightedText(Desc)}</Text>;

由于 return 语句,循环正在终止。 “访问”突出显示,但“小时”未突出显示,因为循环从未达到“小时”。

请帮忙!!!

【问题讨论】:

  • const parts = text.split(regex); 在做什么?你回来两次?工作吗?还是在屏幕下方渲染不同的文字?
  • 它正在拆分我对每个项目的描述,即“测试消息 - 访问时间”。它根据我的搜索值进行拆分。

标签: javascript reactjs react-native search highlight


【解决方案1】:

只需使用string.includes(substring) 而不是===

因为使用=== 代表相同的值。但包括只需要“包含”。

这可能解决了你的问题,试试看。 :)

return (
  <Text>{parts.map(part => (value.toLowerCase().includes(part.toLowerCase())) ?
      <Text style={{backgroundColor: 'red'}}>{part}</Text> : part)}
  </Text>);
}

UPD1:

如果你想达到类似的效果,我建议你将搜索字符串通过.split(" ");拆分为数组,并将数组中的每个字符串映射到突出显示

UPD2:

您不必使用 for 循环!只需将其添加到您的条件中,例如:

{parts.map(part =>
  (part[0].toLowerCase() === valu.toLowerCase()
  || part[1].toLowerCase() === valu.toLowerCase()) // change to your parameter

【讨论】:

  • 试过了,没用。猜猜问题出在我的正则表达式上。也试过 \s \\s 。用我的搜索栏图片更新了我的问题。
  • 猜想我必须在 getHighlightedText 函数中拆分我的搜索值,然后单独突出显示它。如果我的搜索值为“访问时间”,我应该将其拆分为“列表”和“小时”,然后传递这些单独的值。你认为它会起作用吗??
  • 我看到了你的新问题,但它应该不是亮点!根据您的逻辑,如果我搜索“我们的年龄”,它应该突出显示大部分单词。真的很奇怪。我已经更新了建议的答案。
  • 它应该像搜索一样突出显示:“visiting-hour”或“visiting, hour”
  • 是的,我添加了一个 For 循环(请参阅我更新的问题)。
最近更新 更多