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

React+Formik中如何条件合并两个Yup不可变验证对象

正确合并Yup验证Schema的方法

你之前的写法错误在于把Yup的Schema实例当成普通JS对象来扩展了——facValidation和insValidation都是Yup生成的ObjectSchema实例,不是普通对象,用{...facValidation, ...insValidation}得到的不是有效的Yup Schema,Formik无法识别它。

正确的合并方式

Yup提供了专门的方法来合并Schema,或者你也可以提取字段重新构建:

方法1:使用concat方法(推荐)

Yup的ObjectSchema自带concat方法,可以直接合并两个对象Schema:

const combinedSchema = facValidation.concat(insValidation);

方法2:提取字段重新构建Schema

如果你需要更灵活的字段控制,可以提取两个Schema的fields属性,用shape重新创建:

import * as Yup from 'yup';

const combinedSchema = Yup.object().shape({
  ...facValidation.fields,
  ...insValidation.fields,
});

你的组件中正确的条件使用方式

注意你原来的条件表达式insValidation ? facValidation : ...逻辑有问题——insValidation是一个Schema实例,永远为真,会一直返回facValidation,不会执行合并分支。替换成你实际的判断条件(比如控制是否启用Instagram验证的布尔变量)后,代码如下:

import { facValidation, insValidation } from "./validation";

// 替换成你的实际判断条件,比如是否仅启用Facebook验证
const onlyUseFacebook = false;

<Formik
  initialValues={initialState}
  validationSchema={onlyUseFacebook ? facValidation : facValidation.concat(insValidation)}
  onSubmit={handleSubmit}
>
  {({ errors, touched }) => <Form></Form>}
</Formik>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:05:23