You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+TypeScript Todo应用中Formik表单出现「非受控输入转为受控输入」警告的解决方案求助

解决React+Formik中“Uncontrolled Input to Controlled”警告

嘿,我一眼就看出问题所在了——这个警告的核心原因是表单字段和你的initialValues配置不匹配,导致Formik初始化时某个字段的值是undefined,当你输入内容后它突然变成了有值的状态,触发了React的受控/非受控切换警告。

咱们一步步来修复:

1. 修正字段名不匹配的问题

你定义的createTodoModel里的字段是todo,但在TodoForm里犯了两个字段名不匹配的错误:

  • 给TextField传的是field='name'
  • validationSchema验证的也是name字段

但你的initialValues(也就是props.model)里根本没有name这个属性,只有todo和isComplete。这就导致Formik初始化时name字段的值是undefined,输入时突然变成字符串,直接触发了警告。

修改这两处:

export const TodoForm = (props: TodoFormProps) => {
  return(
    <Formik
      initialValues={props.model}
      onSubmit={props.onSubmit}
      validationSchema={yup.object({
        // 把name改成todo,对应model里的字段
        todo: yup.string().max(50, 'max length is 50 characters').required('You must add a todo').firstLetterUpperCase()
      })}
    >
      {(FormikProps) => (
        <Form>
          {/* 把field='name'改成field='todo',和model字段对应 */}
          <TextField field='todo' displayName='What do you need done?' />
          <Button children='Add your todo' className='btn btn-outline-primary' disabled={FormikProps.isSubmitting} />
        </Form>
      )}
    </Formik>
  )
}

2. 确保initialValues覆盖所有表单字段

记住Formik的一个核心原则:所有在表单中使用的字段,必须在initialValues里有明确的初始值(不能是undefined)。

你现在TodoView里传递的model={{todo: "", isComplete: false}}已经满足要求——todo有初始空字符串,isComplete有初始布尔值,后续如果要给isComplete加表单控件,也能直接复用这个初始值,不会再触发类似警告。

额外小提示

注意你的firstLetterUpperCase()是自定义的Yup验证规则,确保它已经正确注册到Yup的原型上了,不然可能会引发其他错误,但这不是当前警告的诱因。

做完这些修改后,那个受控/非受控的警告应该就彻底消失了。

内容的提问来源于stack exchange,提问作者Joro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:32:45