I am currently pulling data from an API that gives random user data like name, age, email, etc … I have setup a searchbar component and I map over the array but it returns all my names without waiting on a userInput. I am passing my state as props deconstructed as shown below. I also get no errors on my terminal and my console except for a key prop that should not be an issue for this.
import React, { useState } from "react";
const SearchBar = ({userData}) => {
const [searchInput, setSearchInput] = useState("")
const handleChange = (e) => {
e.preventDefault();
setSearchInput(e.target.value);
}
if (searchInput.length > 0) {
userData.filter((data) => {
return data.name.first.match(searchInput);
})
}
return (
<div>
<input
type="text"
placeholder="Search"
onChange={handleChange}
value={searchInput} />
<table>
<tbody>
<tr>
<th>First name</th>
<th>Last name</th>
</tr>
{userData.map((user, index) => {
return (
<tr>
<td>{user.name.first}</td>
<td>{user.name.last}</td>
</tr>
)
})}
</tbody>
</table>
</div>
);
};
export default SearchBar;
Advertisement
Answer
You need to store the filtered results in another variable:
let filteredData=[];
if (searchInput.length > 0) {
filteredData = userData.filter((data) => {
return data.name.first.match(searchInput);
})
}
and then in you JSX use filteredData instead of userData
{ filteredData.map((user, index) => {
return (
<tr>
<td>{user.name.first}</td>
<td>{user.name.last}</td>
</tr>
)
})}