【发布时间】:2021-06-30 21:58:33
【问题描述】:
所以这里我有搜索功能。除非在数组中找不到 Item ,否则一切正常。我已经尝试过使用 objects.Keys 的东西,但它在渲染上显示它,而不是在没有像它应该的那样找到 Book 时显示它。我应该使用 if 语句还是。
import React,{useState, useEffect, useRef, useContext}from 'react'
import {FaSearch} from 'react-icons/fa'
import {
Link, useHistory
} from "react-router-dom";
import { BookContext } from '../../context/books';
import SearchBooks from './SearchBooks';
const Search = () => {
const {data}= useContext(BookContext)
const [searchValue, setSearchValue] = React.useState('');
const history= useHistory()
const ref=useRef()
function filterBooks(book) {
console.log(book);
if (!searchValue.length ) return false;
return book.bookName?.toLowerCase().includes(searchValue.toLowerCase());
}
const handleSearch = (e) => {
if (ref.current && !ref.current.contains(e.target)) {
setSearchValue('')
}
};
useEffect(() => {
document.addEventListener('click', handleSearch);
return () => {
document.removeEventListener('click', handleSearch);
};
}, []);
return (
<div className='search__cont' ref={ref}>
{Object.keys(data).filter(filterBooks).length === 0 &&(
<div>
<h3>Book not found</h3>
</div>
)}
<SearchBooks searchValue={searchValue} setSearchValue={setSearchValue }/>
{Object.keys(data)
.map((key) => data[key])
.reduce((acc, curr) => acc.concat(curr), [])
.filter(filterBooks)
.map((book) => {
return (
<>
<div className='search__books'
onClick={() => {
history.push("/book/id", { book }); setSearchValue('')
}}
>
{" "}
{book.bookName}{" "}
</div>
</>
);
})}
</div>
)
}
export default Search
【问题讨论】:
-
如果你认为这个我忘了删除它
if(!searchValue.length ) return book.bookName > 10。那是你推我的尝试。我知道这是错误 -
问题是这样的。未找到搜索值时,它不显示“未找到任何书”。我有 10 个相互连接的组件。所以创建沙箱至少需要 20 分钟。如果你不知道你就不知道
标签: javascript json reactjs filtering