我有Radio按钮:A、B和C.

在按钮B下,有一个 Select 框,只有在 Select B时,我才想使此 Select 框为"必需".

这是简化的代码:

interface ButtonFormType {
    notificationType: "A" | "B" | "C";
    selectedId?: string;
}
const {
        register,
        handleSubmit,
        getValues,
        watch,
        formState: { errors },
    } = useForm<ButtonFormType>();

.
.
.

return(
 <form onSubmit={submit}>
  <RadioGroup defaultValue={getValues("buttonType")}>
    <VStack>
      <Radio {...register("buttonType")} value={"A"}> Button A </Radio>
      <Radio {...register("buttonType")} value={"B"}> Button B </Radio>
      <FormControl isInvalid={!!errors[`selectedId`]}>
         <Select
            placeholder={"select"}
            {...register("selectedId", {
                required:
                   getValues("buttonType") === "B"
                   ? "please select id"
                   : false,
            })}
         >
            {idList.map(({ id, title }) => {
               return (
                  <option key={id} value={id}>
                       {title}
                  </option>
                                        );
            })}
         </Select>
      </FormControl>
     <Radio {...register("buttonType")} value={"C"}> Button C </Radio>
    </VStack>
   </RadioGroup>
                  
   <HStack marginY="40px" spacing={4}>
      <Button type="submit"> Submit </Button>
   </HStack>
</form>
)

当我 Select 按钮B(不从 Select 框中 Select 任何内容)并点击提交按钮时, 它不会给我任何错误.

如果我再次点击提交按钮,它会显示错误消息.

我判断了一下,发现getValues("buttonType")没有在我更改buttonType后立即更新.

一旦我点击提交按钮,它就会更新.为什么?

我可以通过这样将getValues更改为watch来解决这个问题

required:
                   watch("buttonType") === "B"
                   ? "please select id"
                   : false,

但仍然不明白为什么getValues不起作用. 有人知道吗?

推荐答案

你可以参考this description.

watch和getValues之间的区别在于getValues不会触发重新呈现或订阅输入更改.

所以getValues不知道您的实时变化,但watch知道.

Reactjs相关问答推荐

在此上下文中如何在缓冲(隐藏)视频和渲染视频之间切换?

useReducer和带有回调的useState之间是否有实际区别?

有没有方法覆盖NextJS 14中的布局?

Reaction-路由v6动态路径RegExp

以下代码是否存在安全问题?

防止在Reaction中卸载

如何使用皮金贴图在Reactjs中制作 map 上的点之间的线的动画?

左边框不在图表中显示

React Todo List 应用程序我在实现删除功能时遇到问题

如何使用服务器中的数据自动填充表单字段?

获取更多数据后更新 DOM,而不刷新 React.js 中的页面

useRef.current.value 为空值

如何处理页面加载时发生的 reactjs 错误?

React Native Realm 应用程序在发布构建后崩溃

React:如何设置光标 Select

React Final Form - 单选按钮在 FieldArray 中不起作用

当用户输入相同信息时如何禁用更新

如何在 React JS 上使文本中的单词可点击

ReactJS:按钮启用禁用更改 colored颜色

仅在重新渲染后设置状态