When setting useState const [searchString, setString] = useState([])
with a string setString("some string")
it will be sent it immediately and shown at the other component <Home/>
,
BUT when I send an array it will be stated settingResults(resultArray)
only after the second onClick
here.
I tried settingResults([...resultArray])
- its the same.
All functions checked with console.log()
.
Header.jsx
function Header({ settingResults }) {
const [productsObj, setObjs] = useState([]);
const [searchString, setString] = useState('');
let resultArray = [];
const onChangHandler = (e) => {
setString(e.target.value);
};
const activeSearch = () => {
if (searchString.length > 0) {
resultArray = productsObj.filter((obj) =>
obj.productName.toLowerCase().includes(searchString.toLowerCase())
);
if (resultArray.length !== 0) {
settingResults(resultArray);
}
}
resultArray = [];
};
return (
<div>
<header className='header-shop'>
Welcome to Vitamins Store
<br />
<input
placeholder='Search here'
value={searchString}
onChange={(e) => onChangHandler(e)}
/>
<button onClick={activeSearch}>Search</button>
</header>
</div>
);
}
App.js
function App() {
const [searchString, setString] = useState([]);
return (
<div className='App'>
<Header settingResults={setString} />
<Home searchResults={searchString} />
<Footer />
</div>
);
}
Home.jsx
function Home({ searchResults }) {
const [itemSearchResults, setResults] = useState([]);
const [viewResults, setViewResult] = useState(null);
let itemsFound = [];
useEffect(() => {
setResults(searchResults);
itemsFound = itemSearchResults.map((productObj) => {
return (
<div key={productObj.id}>
{productObj.productName} <br />
{productObj.price}
<br />
<img src={productObj.image} />
</div>
);
});
setViewResult(itemsFound);
}, [searchResults]);
return (
<div>
<h3>Home</h3>
<h1>{viewResults}</h1>
</div>
);
}
Anyone know why useState
won't work first time with an object-array ?