使用反应钩子 setstate 不工作将数组推送到状态

时间:2021-05-16 11:18:12

标签: reactjs react-select

我已将状态 selectedProductList 初始化如下:

const [selectedProductList, setSelectedProductList] = useState([]);

在返回部分:我有以下片段:

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/> 是反应选择组件,并且在更改时触发 handleProductSelection 事件。 而且,为了处理这个选择场景,我有:

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]);

在这里,每当我更改选择列表时,它都会将值安慰为:

enter image description here

但是,如果我查看组件选项卡,它显示为 [undefined,undefined,[],undefined,undefined,undefined,[]]

1 个答案:

答案 0 :(得分:0)

您确定要将新产品定义为数组吗?这似乎更正确:

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/格式化程序(ESLint、Prettier)仍会抱怨此代码。我强烈建议您将其中任何一种嵌入到您的 IDE 中!

根据产生 JSX 的内联条件,您有两个选择: