在 React 中创建搜索功能时出现问题
我是 React 的新手,我正在开发一个小项目,该项目使用搜索栏来查找从数据库中获取的数据。
我尝试的代码如下:
function Posts() {
const [notes, setNotes] = useState([]);
useEffect(()=>{
getAllNotes();
}, []);
const getAllNotes = async () => {
await axios.get(`/buyerPosts`)
.then ((response)=>{
const allNotes=response.data.existingPosts;
setNotes(allNotes);
})
.catch(error=>console.error(`Error: ${error}`));
}
console.log(notes);
const filterData = (postsPara, searchKey) => {
const result = postsPara.filter(
(notes) =>
notes?.address.toLowerCase().includes(searchKey) ||
notes?.contact.toString().toLowerCase().includes(searchKey)
);
setNotes(result);
};
const handleSearchArea = (e) => {
const searchKey = e.currentTarget.value;
axios.get(`/buyerPosts`).then((res) => {
if (res?.data?.success) {
filterData(res?.data?.existingPosts, searchKey);
}
});
};
return(
<div className="posts-b">
<div className="posts__container-b">
<div className="search-box">
<input type="text" placeholder="What are you looking for?" onChange={handleSearchArea}></input>
<i className="fas fa-search"></i>
</div>
<main className="grid-b">
{notes.map((note,index)=> (
<article>
<div className="text-b">
<h3>Post ID: {index + 1}</h3>
<p>Location: {note.address}</p>
<p>Post Type: {note.postType}</p>
<p>Address: {note.address}</p>
<p>Telephone No: {note.contact}</p>
</div>
</article>
))}
</main>
</div>
</div>
);
}
export default Posts;
从第一个 API 调用,我获得了一个长度为 10 的对象数组。此图显示了我从第一个 API 调用中获得的数据。
如上图所示,在所有 10 个数组中还有另一个称为
wasteItemList
的对象数组。我正确创建了搜索函数,并且可以使用以下代码
notes?.address.toLowerCase().includes(searchKey) || notes?.contact.toString().toLowerCase().includes(searchKey)
搜索上述长度为 10 的对象数组中的数据。然后,我尝试修改上述代码以像这样
notes?.wasteItemList?.item.toLowerCase().includes(searchKey) || notes?.wasteItemList?.wasteType.toLowerCase().includes(searchKey)
搜索
wasteItemList
数组内的数据。但是它不起作用,并出现错误“未处理的拒绝(TypeError):无法读取未定义的属性‘toLowerCase’”。
导致此问题的原因是什么。是否无法在另一个对象数组中已经存在的对象内部数组中搜索数据?如果可能的话我该如何解决这个问题?
也欢迎对代码提出任何其他评论。我来这里是为了学习。
谢谢!
notes?.address
是单个字符串属性,但是
notes?.wasteItemList
是对象列表。因此
notes?.wasteItemList?.item
将返回未定义的值
您可以做的是运行
map
来提取
item
键列表并使用
join
函数进行连接,然后使用
includes
函数,
以下代码片段将让您明白
notes?.wasteItemList?.map(wasteItem => wasteItem.item).join(' ').toLowerCase().includes(searchKey)
wasteItemList
是一个数组,您尝试使用以下命令访问它:
wasteItemList?.item.toLowerCase()
AND
wasteItemList?.wasteType.toLowerCase()
这将导致
wasteType
未定义,因此 toLowerCase() 也会引发错误,因为它与您执行此操作类似:
undefined.toLowerCase() => Cannot read property 'toLowerCase' of undefined
对于
wasteItemList
是一个数组,因此如果您想访问其变量,则需要使用另一个循环来访问它。
您正在尝试对数组调用 .toLowerCase()。您需要在该数组内进行搜索(即使它嵌套在另一个数组的对象内也没关系) - 以下是有关如何执行此操作的建议:
const result = postsPara.filter(notes =>
notes?.wasteItemList?.some(
wasteItem =>
wasteItem.item?.toLowerCase().includes(searchKey) ||
wasteItem.wasteType?.toLowerCase().includes(searchKey),
),
);
由于这是一个一般性的 javascript 问题,并非特定于 react,因此您可能需要更改标签。