react-hooks表单方法 - setValue - 不起作用

IT技术 javascript reactjs react-hooks frontend react-hook-form
2021-05-12 14:29:07

我有一些可清除的选择,我想将applets状态字段重置为空数组。

const defaultFormValues = { device: { ...initialDevice }, applets: [] };
  const { control, getValues, setValue, reset, handleSubmit } = useForm<CreateDeviceFormData>({
    mode: "all",
    reValidateMode: "onChange",
    defaultValues: defaultFormValues,
    resolver: yupResolver(validationSchema),
  });

  const onChangeHandler = React.useCallback(
    (value: Experience | null) => {
      if (value) {
        setValue("applets", getApplets(value));
      } else {
        setValue("applets", []);
        // reset(defaultFormValues);
      }

      setValue("device.experience_id", value ? value.id : undefined);
    },
    [templateSelector, setValue],
  );

  console.log("current data", getValues(), control);
  return (
    <>
      <SomeAutocompleteComponent control={control} onChange={onChangeHandler} />
      <SelectAppletsComponent control={control} />
    </>
  );


export const SelectAppletsComponent = ({ control, onChange }) => {
  const applets = useWatch({ control, name: "applets" }) as Applet[];
  const device = useWatch({ control, name: "device" }) as Device;

  if (!applets.length) {
    return null;
  }

  return (
    <SpanWrapper className="p-col-8">
      {applets.map((applet) => (
        <LabelRadio
          key={applet.id}
          inputId={applet.applet_type}
          value={applet.applet_type}
          label={applet.name}
          checked={device.applet_type === applet.applet_type}
          onChange={onChange}
        />
      ))}
    </SpanWrapper>
  );
};

问题是清除 UI 上的选择setValue("applets", []);由于某种原因不起作用,我不明白为什么,以及如何在没有reset方法的情况下进行,这会重置整个状态,而不仅仅是我理解的单个属性

2个回答

如果要将字段用作 RHF 的表单状态,则应始终注册字段。

  React.useEffect(() => {
    register("applets");
  }, [register]);

这解决了一个问题。

只是为了跟进,这确实是 AuthorProxy 提供的正确解决方案。

使用 defaultValues 不会注册字段(似乎它们仍然在提交时添加到 formData 中,但由于它们没有注册,任何用户触发的对这些字段的更改都不会反映在 formData 上)。

您必须注册您希望用户能够与之交互的每个字段。我们通常通过 JSX 中的输入来注册字段,但我们也需要注册数组,因为在 JSX 中没有它的输入。

如react-hooks表单库的作者所示。

https://github.com/react-hook-form/react-hook-form/discussions/3160

和沙盒

https://codesandbox.io/s/inspiring-wood-4z0n0?file=/src/App.tsx