i'm trying to have a component only render when I have used a search button.
The code below is my current code
Made the changes, Now receiving this error.
error ] ERROR in /home/holborn/Documents/Work/Portfolio/Data_Scraping/Eldritch/client/pages/index.tsx(21,19): 21:19 Cannot find name 'Product'. 19 | interface OutputProps { 20 | searched?: string
21 | productList?: Product[] | ^ 22 | } 23 | 24 | const Output: React.FC = ({ searched, productList }) => {
This is the array for product list when the search is made
JSX element type 'void' is not a constructor function for JSX elements.
262 |
263 | return (
> 264 | <Output columns={columns} message={message} handleSearch={handleSearch} searchRef={searchRef} productList={productList}/>
| ^
265 |
266 | );
267 | }
You expect the output component to have productList
and searched
as props however you pass it data
as a prop
Secondly you must define the interface directly and not as a function
interface OutputProps {
searched?: string
productList?: Product[]
}
...
<Output searched={searched} productList={productList}/>
Breaking down your code:
function Output(searched,productList) {
if (!searched && !productList) {
return null;
}
return (
<div>
<div>
<p></p>
{/* <Chart data={productList} /> */}
</div>
<table className="table-auto">
<thead>
<tr>
<th className="px-4 py-2">Name</th>
<th className="px-4 py-2">Price</th>
<th className="px-4 py-2">Brand</th>
</tr>
</thead>
<tbody>
{productList.map((e, index) => (
<tr key={index}>
<td className="border px-4 py-2">{e.Product}</td>
<td className="border px-4 py-2">{e.Price}</td>
<td className="border px-4 py-2">{e.Brand}</td>
</tr>
))}
</tbody>
</table>
</div>
);
}
<Output data = {etc}/>
However, this is invalid. when you call a component through JSX(ie. <Output/>
), React will excpect that Output
is called with a single props
argument, not multiple arguments. (besides, your etc
is undefined here)
so you might have meant to do this:
// place your parameters inside an object, commonly referred to as "props"
function Output({ searched, productList }) {
And, since you're using Typescript, you can leverage the type system to work for you:
interface OutputProps {
searched?: string
productList?: Product[]
}
const Output: React.FC<OutputProps> = ({ searched, productList }) => {
// Typescript infers searched and productList typing here
if(!searched && !productList) {
return null;
}
...
}
and while we're at it, please format your code. Look into Prettier to make sure your code stays consistent and easy to read.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With