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

如何用Yup+Formik+Material UI实现指定校验仅高亮不显示提示

可以实现,核心逻辑是拆分校验的错误状态判断和错误文案展示逻辑,分两步改造即可:

步骤1:调整Yup校验规则

给两个校验规则设置不同的返回值,格式校验失败时返回空字符串或特殊标识的错误信息:

const YUP_STRING = Yup.string().ensure().trim();

const validationSchema = yup.object().shape({
   code: YUP_STRING.test(
    'duplicateCheck',
    '该编码已存在',
    code => code !== prohibitedCode
  ).test(
    'formatCheck',
    '', // 格式校验失败时返回空错误文案
    code => codeValidator.validate(code)
  );
});

步骤2:调整Material UI字段的渲染逻辑

原来的错误状态判断默认会把空字符串的错误判定为无错误,需要拆分错误状态和错误提示的判断规则:

<TextField
  name="code"
  label="业务编码"
  value={formik.values.code}
  onChange={formik.handleChange}
  onBlur={formik.handleBlur}
  // 错误状态判断:只要字段被触碰且存在对应错误(无论错误文案是否为空)就触发高亮
  error={formik.touched.code && formik.errors.code !== undefined}
  // 错误提示判断:仅当错误文案非空时才展示
  helperText={formik.touched.code && formik.errors.code || undefined}
/>

可选更稳妥的实现方案

如果担心空字符串会被后续逻辑误判,可以给格式校验设置带特殊标识的错误,渲染时过滤即可:

// 校验规则改造
const validationSchema = yup.object().shape({
   code: YUP_STRING.test(
    'duplicateCheck',
    '该编码已存在',
    code => code !== prohibitedCode
  ).test(
    'formatCheck',
    function(code) {
      if (!codeValidator.validate(code)) {
        return this.createError({
          message: 'FORMAT_ERROR',
          type: 'hidden_error'
        })
      }
      return true
    }
  );
});

// 渲染逻辑调整
<TextField
  // ...其他属性不变
  helperText={
    formik.touched.code && 
    formik.errors.code && 
    formik.errors.code !== 'FORMAT_ERROR' 
      ? formik.errors.code 
      : undefined
  }
/>

Yup默认按顺序执行校验规则,第一个重复校验失败后不会触发第二个校验,刚好满足第一个校验优先级更高的需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:00:01