使用 react hooks setstate 将数组推送到状态不起作用
Push array to the state using react hooks setstate not working
我已经初始化状态selectedProductList
如下:
const [selectedProductList, setSelectedProductList] = useState([]);
在 return 部分:我有以下代码段:
return (
<>
<Select
id="product_id"
name="product_id"
onChange={handleProductSelection}
// value={formData.product_id}
value={products.filter(function (option) {
return option.value === formData.product_id;
})}
options={products}
className={` ${
errors["product_id"] ? "is-invalid" : ""
}`}
/>
{selectedProductList.map((item) => {
{
console.log("called");
item != undefined && (
<tr key={item.product_id}>
<td>{item.product_id}</td>
</tr>
);
}
// <SelectedProductList repeatedRow={} errors/>;
})}
</>
)
在这里,<Select/>
是反应 select 组件,并且在更改时它会触发 handleProductSelection
事件。
而且,为了处理这种 selection 场景,我有:
const handleProductSelection = (event) => {
console.log("handle selection>> " + event);
const { name, value, label } = event;
console.log("handle selection>> " + value);
var newProductArr = [];
newProductArr[value] = [];
newProductArr[value]["product_id"] = value;
newProductArr[value]["quantity"] = "";
newProductArr[value]["unit_id"] = "";
newProductArr[value]["price_per_unit"] = "";
setSelectedProductList((selectedProductList) => [
...selectedProductList,
...newProductArr,
]);
};
useEffect(() => {
console.log("selectedProductList >>", selectedProductList);
}, [selectedProductList]);
在这里,每当我更改 select 列表时,它都会将值设置为:
但是,如果我查看组件选项卡,它显示为 [undefined,undefined,[],undefined,undefined,undefined,[]]
您确定要将新产品定义为数组吗?这似乎更正确:
var newProduct = {};
newProduct["product_id"] = value;
newProduct["quantity"] = "";
newProduct["unit_id"] = "";
newProduct["price_per_unit"] = "";
setSelectedProductList((selectedProductList) => [
...selectedProductList,
newProduct,
]);
编辑
您已将传递给 map()
的回调函数定义为 (item) => { /* ... */ }
。这种语法需要 return
语句:
{selectedProductList.map((item) => {
console.log("called");
return (
item != undefined && (
<tr key={item.product_id}>
<td>{item.product_id}</td>
</tr>
)
);
})}
请注意,虽然这有效,但好的 linter/formatter(ESLint、Prettier)仍然会抱怨这段代码。我强烈建议您将其中任何一个嵌入到您的 IDE!
根据产生 JSX 的内联条件,您有两个选择:
我已经初始化状态selectedProductList
如下:
const [selectedProductList, setSelectedProductList] = useState([]);
在 return 部分:我有以下代码段:
return (
<>
<Select
id="product_id"
name="product_id"
onChange={handleProductSelection}
// value={formData.product_id}
value={products.filter(function (option) {
return option.value === formData.product_id;
})}
options={products}
className={` ${
errors["product_id"] ? "is-invalid" : ""
}`}
/>
{selectedProductList.map((item) => {
{
console.log("called");
item != undefined && (
<tr key={item.product_id}>
<td>{item.product_id}</td>
</tr>
);
}
// <SelectedProductList repeatedRow={} errors/>;
})}
</>
)
在这里,<Select/>
是反应 select 组件,并且在更改时它会触发 handleProductSelection
事件。
而且,为了处理这种 selection 场景,我有:
const handleProductSelection = (event) => {
console.log("handle selection>> " + event);
const { name, value, label } = event;
console.log("handle selection>> " + value);
var newProductArr = [];
newProductArr[value] = [];
newProductArr[value]["product_id"] = value;
newProductArr[value]["quantity"] = "";
newProductArr[value]["unit_id"] = "";
newProductArr[value]["price_per_unit"] = "";
setSelectedProductList((selectedProductList) => [
...selectedProductList,
...newProductArr,
]);
};
useEffect(() => {
console.log("selectedProductList >>", selectedProductList);
}, [selectedProductList]);
在这里,每当我更改 select 列表时,它都会将值设置为:
但是,如果我查看组件选项卡,它显示为 [undefined,undefined,[],undefined,undefined,undefined,[]]
您确定要将新产品定义为数组吗?这似乎更正确:
var newProduct = {};
newProduct["product_id"] = value;
newProduct["quantity"] = "";
newProduct["unit_id"] = "";
newProduct["price_per_unit"] = "";
setSelectedProductList((selectedProductList) => [
...selectedProductList,
newProduct,
]);
编辑
您已将传递给 map()
的回调函数定义为 (item) => { /* ... */ }
。这种语法需要 return
语句:
{selectedProductList.map((item) => {
console.log("called");
return (
item != undefined && (
<tr key={item.product_id}>
<td>{item.product_id}</td>
</tr>
)
);
})}
请注意,虽然这有效,但好的 linter/formatter(ESLint、Prettier)仍然会抱怨这段代码。我强烈建议您将其中任何一个嵌入到您的 IDE!
根据产生 JSX 的内联条件,您有两个选择: