Formik 表单验证时样式不生效怎么办?
我用 Formik 写了个登录表单,想在输入框出错时加个红色边框,但写了 CSS 却没反应。明明错误信息都正常显示了,就是样式没加上去,是不是 className 没绑对?
我在 Field 组件上加了 {,也确认 errors 和 touched 都有值,但输入框就是不变红。className={errors.email && touched.email ? 'error' : ''}}
input.error {
border: 2px solid #ff4444;
outline: none;
}
input {
padding: 8px;
border: 1px solid #ccc;
}
Field组件生成的 DOM 结构和你想象的可能不太一样。首先,你的 CSS 选择器
input.error是问题的根源。Formik 的Field组件默认会渲染成一个包含input的 div 结构,className 实际上是加在了包裹 input 的 div 上,而不是直接加在 input 上。试试这样改:
1. 先调整 CSS 选择器:
2. 然后检查你的 Field 组件写法。建议用 render props 方式更可靠:
需要注意几点:
- Formik 的 Field 默认组件会生成两层 DOM 结构
- 直接在 Field 上加 className 是加到外层 div 上
- 更好的方式是手动控制渲染,或者用
as属性指定原生 input如果还是不行,可以试试这个更简单粗暴的版本:
原理就是 Formik 的样式处理需要穿透到实际的 input 元素上。这个问题我之前也踩过坑,调试了半天才发现是选择器层级的问题。