根据先前 <select> 状态更新 <select> 状态的警告

Warnings on update state of <select> based on state of previous <select> state

我有两个下拉菜单,第二个下拉菜单的值应该根据第一个下拉菜单的状态更新。 虽然代码似乎有效,但我收到 out-of-range value 的警告。我如何改进此代码以使警告消失?

MWE on Codesandbox

完整的组件以备不时之需。

const MyForm = () => {
  const [state1, setState1] = useState(list1[0]);
  const [state2, setState2] = useState(list2[0]);

  return (
    <>
      <FormControl fullWidth sx={{ marginY: "16px" }}>
        <InputLabel>List 1</InputLabel>
        <Select
          label="List 1"
          value={state1.code}
          onChange={(e) => {
            const tmpState1 = list1.find(
              (item) => item.code === e.target.value
            );
            setState1(tmpState1);
          }}
        >
          {list1.map((item) => {
            return (
              <MenuItem value={item.code} key={item.name}>
                {item.name}
              </MenuItem>
            );
          })}
          <MenuItem value={""}>All</MenuItem>
        </Select>
      </FormControl>
      <FormControl fullWidth sx={{ marginY: "16px" }}>
        <InputLabel>List 2</InputLabel>
        <Select
          label="List 2"
          value={state2.name}
          onChange={(e) => {
            const tmpState2 = list2.find(
              (item) => item.name === e.target.value
            );
            console.log(tmpState2);
            setState2(tmpState2);
          }}
        >
          {list2
            .filter((item) => item.code === state1.code)
            .map((item) => {
              return (
                <MenuItem value={item.name} key={item.name}>
                  {item.name}
                </MenuItem>
              );
            })}
        </Select>
      </FormControl>
    </>
  );
};

export default MyForm;

问题是当变量 state1 更新时,第二个下拉列表的值不在更新的 <MenuItem> 列表中。因此它会发出警告。

一个简单的解决方法是在 state1 更改时更新第二个下拉列表中的值:

//...
<FormControl fullWidth sx={{ marginY: "16px" }}>
  <InputLabel>List 1</InputLabel>
    <Select
      label="List 1"
      value={state1.code}
      onChange={(e) => {
        const tmpState1 = list1.find(
          (item) => item.code === e.target.value);
        {/* this is the fix */}
        setState2(list2.find((item) => item.code === tmpState1.code));
        setState1(tmpState1);
      }}
    >
      {list1.map((item) => {
        return (
          <MenuItem value={item.code} key={item.name}>
            {item.name}
          </MenuItem>
        );
      })}
    <MenuItem value={""}>All</MenuItem>
  </Select>
</FormControl>
//...