resolving error message "react-dom.development.js:4091 Uncaught TypeError: onItemSelect is not a function"
resolving error message "react-dom.development.js:4091 Uncaught TypeError: onItemSelect is not a function"
我不知道为什么,但是当我更改 select 或 ."react-dom.development.js:4091 Uncaught TypeError: onItemSelect 中的选项时,我不断收到此错误不是函数
:(
import React from "react";
import Product from "./Product";
import ListGroup from "./listGroup";
export default function Main(props) {
const { products, onAdd, categories } = props;
const handleCategorySelect = () => {
console.log("Click");
};
return (
<main className="block col-2">
<ListGroup items={categories} />
<h2>Products</h2>
<div>
{products.map((product) => (
<Product
key={product.id}
product={product}
onAdd={onAdd}
onItemSelect={handleCategorySelect}
></Product>
))}
</div>
</main>
);
}
我的 listGroup.jsx 是:
import React from "react";
function ListGroup(props) {
const { items, onItemSelect } = props;
return (
<form>
<select
value=""
id="category"
name="category"
onChange={() => onItemSelect()}
>
<option hidden value="">
Choose here
</option>
{items.map((item) => (
<option key={item._id}>{item.name}</option>
))}
</select>
</form>
);
}
export default ListGroup;
以及如何将项目对象传递给 onChange ?
我的意思是,如果它是一个列表组,我会选择 :
<ul className="list-group">
{items.map(item => (
<li
onClick={() => onItemSelect(item)}
key={item[valueProperty]}
className={
item === selectedItem ? "list-group-item active" : "list-group-item"
}
>
{item[textProperty]}
</li>
))}
</ul>
但是有了 select 和选项我不知道该怎么做。
是因为你没有把函数传给ListGroup组件
export default function Main(props) {
...
<ListGroup items={categories} />
但是你在更改时调用它
function ListGroup(props) {
...
<select
value=""
id="category"
name="category"
onChange={() => onItemSelect()}
>
试试这个
<ListGroup items={categories} onItemSelect={handleCategorySelect} />
下面是如何将 select 的值传回父组件:
function ListGroup({ items, onItemSelect }) {
function handleItemChange(e) {
onItemSelect(e.target.value);
}
return (
<div>
<select onChange={handleItemChange}>
{items.map((item) => <option key={item.name}>{item.name}</option>)}
</select>
</div>
);
}
function Main() {
const items = [
{ name: 'apple' },
{ name: 'milk' },
{ name: 'bread' },
{ name: 'cheese' }
];
function handleListSelect(val) {
console.log(`I selected ${val}`);
}
return (
<div>
<ListGroup items={items} onItemSelect={handleListSelect} />
</div>
);
}
function App() {
return (
<div>
<Main />
</div>
);
}
ReactDOM.render(
<App />,
document.getElementById('root')
);
<script src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<div id="root"></div>
我不知道为什么,但是当我更改 select 或 ."react-dom.development.js:4091 Uncaught TypeError: onItemSelect 中的选项时,我不断收到此错误不是函数 :(
import React from "react";
import Product from "./Product";
import ListGroup from "./listGroup";
export default function Main(props) {
const { products, onAdd, categories } = props;
const handleCategorySelect = () => {
console.log("Click");
};
return (
<main className="block col-2">
<ListGroup items={categories} />
<h2>Products</h2>
<div>
{products.map((product) => (
<Product
key={product.id}
product={product}
onAdd={onAdd}
onItemSelect={handleCategorySelect}
></Product>
))}
</div>
</main>
);
}
我的 listGroup.jsx 是:
import React from "react";
function ListGroup(props) {
const { items, onItemSelect } = props;
return (
<form>
<select
value=""
id="category"
name="category"
onChange={() => onItemSelect()}
>
<option hidden value="">
Choose here
</option>
{items.map((item) => (
<option key={item._id}>{item.name}</option>
))}
</select>
</form>
);
}
export default ListGroup;
以及如何将项目对象传递给 onChange ? 我的意思是,如果它是一个列表组,我会选择 :
<ul className="list-group">
{items.map(item => (
<li
onClick={() => onItemSelect(item)}
key={item[valueProperty]}
className={
item === selectedItem ? "list-group-item active" : "list-group-item"
}
>
{item[textProperty]}
</li>
))}
</ul>
但是有了 select 和选项我不知道该怎么做。
是因为你没有把函数传给ListGroup组件
export default function Main(props) {
...
<ListGroup items={categories} />
但是你在更改时调用它
function ListGroup(props) {
...
<select
value=""
id="category"
name="category"
onChange={() => onItemSelect()}
>
试试这个
<ListGroup items={categories} onItemSelect={handleCategorySelect} />
下面是如何将 select 的值传回父组件:
function ListGroup({ items, onItemSelect }) {
function handleItemChange(e) {
onItemSelect(e.target.value);
}
return (
<div>
<select onChange={handleItemChange}>
{items.map((item) => <option key={item.name}>{item.name}</option>)}
</select>
</div>
);
}
function Main() {
const items = [
{ name: 'apple' },
{ name: 'milk' },
{ name: 'bread' },
{ name: 'cheese' }
];
function handleListSelect(val) {
console.log(`I selected ${val}`);
}
return (
<div>
<ListGroup items={items} onItemSelect={handleListSelect} />
</div>
);
}
function App() {
return (
<div>
<Main />
</div>
);
}
ReactDOM.render(
<App />,
document.getElementById('root')
);
<script src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<div id="root"></div>