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

使用Yup做值转换时Formik返回值异常,如何实现邮箱输入自动转小写

问题原因

Yup 提供的 transform 方法仅作用于 Yup 内部的校验流程,不会主动修改 Formik 存储的 values 数据,你在输入框绑定的 values.email 仍然是原始输入的大写内容,因此不会显示转换后的小写结果。
同时你的代码存在一个小疏漏:initialValues 中仅声明了 name 字段,缺少需要用到的 email 字段,也可能导致异常。


实现方案

方案1:修改输入事件逻辑(最简便,推荐)

直接在输入内容变化时把值转小写再同步给 Formik,无需依赖 Yup 的转换能力:

import React from "react";
import { render } from "react-dom";
import { Formik } from "formik";
import * as Yup from "yup";

import { DisplayFormikState } from "./helper";
import "./style.css";

const validationSchema = Yup.object({
  email: Yup.string()
    .email()
    .required()
    .label("Email")
});

const App = () => (
  <div className="app">
    <Formik
      initialValues={{ email: "" }} // 修正初始值字段
      onSubmit={() => {}}
      validationSchema={validationSchema}
    >
      {(props) => {
        const { handleBlur, handleChange, values, errors, touched } = props;
        return (
          <form onSubmit={props.handleSubmit}>
            <h1>Email Form</h1>

            <input
              type="email"
              name="email"
              onChange={(e) => {
                // 直接把输入值转小写后再传给 Formik 的 handleChange
                const modifiedEvent = {
                  ...e,
                  target: {
                    ...e.target,
                    value: e.target.value.toLowerCase()
                  }
                }
                handleChange(modifiedEvent)
              }}
              onBlur={handleBlur}
              value={values.email}
            />
            {errors.email && touched.email && errors.email}

            <button type="submit">Submit</button>

            <DisplayFormikState {...props} />
          </form>
        );
      }}
    </Formik>
  </div>
);

render(<App />, document.getElementById("root"));

方案2:保留 Yup transform 逻辑同步值

如果你需要保留 Yup 中定义的转换规则,可以在校验阶段把转换后的值同步回 Formik:

<Formik
  initialValues={{ email: "" }}
  onSubmit={() => {}}
  validationSchema={validationSchema}
  validate={(values) => {
    // 手动触发 Yup 校验拿到转换后的值更新到 Formik
    const castedValues = validationSchema.cast(values);
    props.setValues(castedValues);
    return {}
  }}
>
  {/* 其余组件代码保持不变 */}
</Formik>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 08:00:04