javascript - React hook 表单方法 - setValue - 不起作用

标签 javascript reactjs react-hooks frontend react-hook-form

我有一些可清除的选择,我想将 state 中的 applet 字段重置为空数组。

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

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

最佳答案

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

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

这解决了一个问题。

更新: 还有一个新方法 resetField 可用

关于javascript - React hook 表单方法 - setValue - 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68757532/

相关文章:

javascript - ESLint 希望 setSate 作为 useEffect 的依赖项,但这会导致无限循环(react-hooks/exhaustive-deps)

javascript - 在 Canvas 或 div 中嵌套 Three.JS 渲染器

javascript - 使用 CefGlue/CE​​F3 从 JavaScript 调用 .NET

javascript - 我有一个带有 onClick 处理程序的 div,还有带有 onClick 事件的按钮。如何防止按钮触发 div onclick?

reactjs - 子组件在父组件重新渲染时重新渲染,即使 React.memo 返回 true

javascript - 当值相等时,React hooks useState setValue 仍然会重新渲染一次

javascript - 在注入(inject)的脚本中包含 JQuery

javascript - 光标指针显示的描述文本

javascript - babel-plugin-* 和 babel-preset-* 有什么区别

javascript - 使用 eslint exhaustive-deps react 订阅/取消订阅的 useEffect 依赖项