javascript 在React中处理两个checkbox组件

yi0zb3m4  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(130)

我有checkboxgroup组件(父组件),和checkbox(子组件)。我想处理这两个复选框组组件FruitsVegetables在同一页与changeHandler,并获得他们每个人的选中选项。但我得到了这个错误:
未捕获的类型错误:prev[name]不可迭代

interface SelectedOptions {
  [name: string]: string[];
}

const Fruits = [
  {
    label: "Banana",
    value: "Banana",
  },
  {
    label: "Orange",
    value: "Orange",
  },
];

const Vegetable = [
  {
    label: "Carrot",
    value: "Carrot",
  },
  {
    label: "Potatoes",
    value: "Potatoes",
  },
];

export function HomePage() {
  const [checkBoxOptions, setCheckBoxOptions] = useState<SelectedOptions>({});

  const changeHandler = (e: React.ChangeEvent<HTMLInputElement>) => {
    const { value, checked, name } = e.target;

    if (checked) {
      setCheckBoxOptions((prev: SelectedOptions) => ({
        ...prev,
        [name]: [...prev[name], value],   /////error is here
      }));
    } else {
      setCheckBoxOptions((prev: SelectedOptions) => ({
        ...prev,
        [name]: [...prev[name].filter((option: string) => option !== value)],
      }));
    }
  };

  return (
    <div>
          <CheckBoxGroup
            checkBoxOptions={Fruits}
            name={"Fruits"}
            changeHandler={changeHandler}
          />
          <CheckBoxGroup
            checkBoxOptions={Vegetable}
            name={"Vegetables"}
            changeHandler={changeHandler}
          />
    </div>
  );
}
t40tm48m

t40tm48m1#

这个问题应该是因为你的初始状态,作为一个对象,是定义的,但没有初始属性,稍后将由name变量访问。
所以你可以像这样初始化状态

const [checkBoxOptions, setCheckBoxOptions] = useState<SelectedOptions>({
    Fruits: [],
    Vegetables: [] });

或者像[name]: [...(prev[name] || []), value]一样使用空数组回退来访问它们,这样你仍然可以分散值。

相关问题