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

如何将外部状态值传入Yup验证Schema实现Formik字段动态必填校验

解决方案

核心实现方式是将固定的校验Schema改写为接收外部状态作为入参的工厂函数,在父组件渲染时传入最新的状态动态生成对应规则的校验Schema即可:

1. 改造校验Schema文件

不要直接导出固定的Yup对象,改为导出一个工厂函数,外部状态通过函数参数传入:

// validationSchema.ts
import * as Yup from 'yup'

// 入参接收需要用到的外部状态
export const getValidationSchema = (someState: unknown) => Yup.object().shape({
  myField: Yup.string().test('required', 'Field is required', value => {
     if (someState) {
        // someState为真值时,要求字段不能为空
        return !!value
     } 
     // someState为假值时无需校验,直接通过
     return true
  })
})

2. 父组件中传入状态生成Schema

在父组件内调用工厂函数,传入当前最新的状态值,将生成的Schema传给Formik即可:

// 父组件代码
import { useState, useMemo } from 'react'
import { Formik, Form } from 'formik'
import { getValidationSchema } from './validationSchema.ts'

const MyComponent = () => {
  const [someState, setState] = useState()
  // 可选优化:用useMemo缓存Schema,仅someState变化时重新生成
  const validationSchema = useMemo(() => {
    return getValidationSchema(someState)
  }, [someState])

  return (
    <Formik
      initialValues={{ myField: '' }}
      validationSchema={validationSchema}
      onSubmit={(values) => {
        // 提交逻辑
        console.log(values)
      }}
    >
      <Form>
        {/* 表单字段实现 */}
      </Form>
    </Formik>
  )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:03:00