I am pretty new to React.
Previously the search functionality and the productsPage code lived in one file and search worked as expected.
Now I want to decouple the search functionality from productsPage.
This is products.js file where I need items to be searched.
function ProductsPage() {
var categories = data.categories;
const [search, setSearch] = useState(null);
return (
<>
<Container fluid id="searchBar">
<SearchForm searchValue={search} />
</Container>
<Container fluid id="productPage">
<h2 className="text-center py-5">Our Products</h2>
<CardColumns className="pt-3 mb-5">
{categories.map((catNames) => (
<Fragment key={uuid()}>
{catNames.sub_categories.map((subCat) => (
<Fragment key={uuid()}>
{subCat.items
.filter((item) => {
if (search == null) return item;
else if (
item.itemName
.toLowerCase()
.includes(search.toLowerCase())
) {
return item;
}
})
.map((item) => {
return (
<Card className="mb-4 p-3" key={uuid()}>
<div className="prodBorder">
<Card.Title className="pt-5 pb-4 text-center">
{item.itemName}
</Card.Title>
<Card.Img
src={`${item.image.url}`}
className="d-block w-50 mx-auto my-3"
/>
<Card.Subtitle className="pb-4 text-center text-muted">
{item.itemDesc}
</Card.Subtitle>
</div>
</Card>
);
})}
</Fragment>
))}
</Fragment>
))}
</CardColumns>
</Container>
</>
);
}
export default ProductsPage;
This one is search.js file where the onChange handler lives
function SearchForm(props) {
const [search, setSearch] = useState(null);
const searchSpace = (event) => {
let search = event.target.value;
setSearch(search);
};
return (
<Form inline className="position-relative mt-4 mx-auto w-75">
<FontAwesomeIcon icon={faSearch} className="productsSearchIcon" />
<FormControl
id="searchfield"
type="text"
placeholder="Search products..."
onChange={(e) => searchSpace(e)}
className="ml-0 ml-md-3 w-100"
/>
</Form>
);
}
export default SearchForm;