javascript - 如何在自动完成中突出显示搜索文本?
问题描述
我正在尝试制作一个自定义自动完成功能,我可以做到,但我无法突出显示匹配的文本
这是我的代码 https://codesandbox.io/s/affectionate-colden-7embr?file=/src/index.js
matchItems = (items, regexp) => {
let match = false;
items.forEach(item => {
if (item.search(regexp) > -1) {
match = true;
}
});
return match;
};
filterUsers = (users, regexp) => {
const filteredUsers = users.filter(
user =>
user.name.search(regexp) > -1 ||
user.id.search(regexp) > -1 ||
this.matchItems(user.items, regexp) ||
user.address.search(regexp) > -1 ||
user.pincode.search(regexp) > -1
);
return filteredUsers;
};
filterByKeyword = e => {
const keyword = e.target.value;
this.setState({ currentInput: keyword });
if (keyword) {
const regexp = new RegExp(`${keyword}`, 'i');
this.setState({ users: this.filterUsers(users, regexp) });
} else {
this.setState({ users });
}
};
so my code filter works correctly but I am not able to hightlist the text
解决方案
您应该传递currentInput
toName.js
作为道具来填充匹配的单词。尝试这个:
import React from "react";
import PropTypes from "prop-types";
const Name = ({ name, highlight }) => {
if (!highlight.trim()) {
return <span>{name}</span>;
}
const escapeRegExp = (str = "") =>
str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
const regex = new RegExp(`(${escapeRegExp(highlight)})`, "gi");
const parts = name.split(regex);
console.log(parts.filter(part => part));
return (
<span>
{parts
.filter(part => part)
.map((part, i) =>
regex.test(part) ? (
<mark key={i}>{part}</mark>
) : (
<span key={i}>{part}</span>
)
)}
</span>
);
};
推荐阅读
- answer-set-programming - 有没有一种方法可以在 Clingo 中表示任意长度的元组?
- mysql - 在选择中选择
- python - 如何传递与函数的位置参数同名的kwargs?
- perl - 从 xlsx 读取单元格并进行比较
- javascript - 将实用程序脚本添加到 create-react-app React / Typescript 应用程序
- php - PHP 脚本在 Linux 中执行 Shell 命令并使用脚本回复来自系统的任何交互式提示,例如密码
- django - Django ORM 在 15 分钟的时间块内获取数据的平均值
- ios - IQKeyboardManager:是否可以更改 UITextField 和键盘之间的距离?
- ajax - Ajax 调用未在 tomcat 8 中命中 servlet
- javascript - 只要鼠标悬停在 React 中的元素上,就会改变状态