React hooks:React 检测到 NodeDetails 调用的 Hooks 的顺序发生了变化。 / 渲染了比之前渲染更多的钩子

React hooks: React has detected a change in the order of Hooks called by NodeDetails. / Rendered more hooks than during the previous render

我正在使用在列表中呈现的自定义 <CompositeInput> 组件。

      <div className="p-6">
        {nodeProperties.map(({ key, value }) =>
          CompositeInput({
            value: value,
            label: key,
            key: key,
            onChange: editing ? (x) => console.log(x) : undefined,
          })
        )}
        <div className="flex w-full pt-2">{bottomBar}</div>
      </div>

在此列表中,我调用 useState 来保存组件输入状态:

const DataPropertyInput = (
  value: DataPropertyValue,
  onChange?: (newData: DataPropertyValue) => void
) => {
  const [updatedValue, setValue] = useState(value);
  return matchExhaustive(updatedValue, {
    StringWrapper: (string) => (
      <input
        onChange={(ev) => {
          setValue(DataPropertyValue.StringWrapper(ev.target.value));
          onChange?.(DataPropertyValue.StringWrapper(ev.target.value));
        }}
        disabled={!onChange}
        className="p-1 bg-transparent mr-2"
        value={string}
      />
    ),
    DateTimeWrapper: (strData) => <div> "datepicker"</div>,
    Unknown: () => <div> Special property type </div>,
    IntWrapper: (int) => <div> NUMBER INPUT </div>,
    EmptyWrapper: () => <div>Empty </div>,
    ManyOfMany: () => <div>Dropdown here </div>,
  });
};

显然,当我添加另一个 nodeProperty 时,调用的挂钩数量发生了变化。

React useState 的正确使用方法是什么才不会报错?

钩子规则之一是: 确保对给定组件调用挂钩的次数始终相同。

我认为问题的出现是因为您调用的是 function (),而不是组件。现在,CompositeInput 中的挂钩与其父组件相关联。

改变一下看看:

{nodeProperties.map(({ key, value }) =>
          <CompositeInput 
            value={value}
            label={key}
            key={key}
            onChange={editing ? (x) => console.log(x) : undefined} />
  
        )}

Read more