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

能否为react-admin创建的表单使用Formik验证?

在React-Admin表单中使用Formik验证的实现方案

当然可以在react-admin创建的表单中使用Formik进行验证,下面是两种实用的实现方式,同时也会补充一些注意事项:

方式一:完全自定义Formik表单

跳过react-admin自带的<SimpleForm>或<TabbedForm>,直接用Formik构建表单,同时复用react-admin的输入组件(如<TextInput>、<SelectInput>),这些组件支持value、onChange等属性,可以和Formik的状态无缝对接。

示例代码:

import { Create, TextInput, SelectInput, SaveButton } from 'react-admin';
import { Formik, Form } from 'formik';
import * as Yup from 'yup';

// 定义Formik验证规则
const validationSchema = Yup.object().shape({
  title: Yup.string().required('标题不能为空'),
  category: Yup.string().required('请选择分类'),
});

const CustomPostCreate = () => {
  return (
    <Create>
      <Formik
        initialValues={{ title: '', category: '' }}
        validationSchema={validationSchema}
        onSubmit={(values, { setSubmitting }) => {
          // 调用react-admin的dataProvider完成数据提交
          const { dataProvider } = useDataProvider();
          dataProvider.create('posts', { data: values })
            .then(() => setSubmitting(false))
            .catch(error => {
              setSubmitting(false);
              console.error('提交失败:', error);
            });
        }}
      >
        {({ values, handleChange, errors, touched, isSubmitting }) => (
          <Form>
            <TextInput
              source="title"
              value={values.title}
              onChange={handleChange}
              error={touched.title && errors.title}
              helperText={touched.title && errors.title}
            />
            <SelectInput
              source="category"
              choices={[
                { id: 'tech', name: '科技' },
                { id: 'life', name: '生活' },
              ]}
              value={values.category}
              onChange={handleChange}
              error={touched.category && errors.category}
              helperText={touched.category && errors.category}
            />
            <SaveButton 
              type="submit" 
              disabled={isSubmitting}
            />
          </Form>
        )}
      </Formik>
    </Create>
  );
};

export default CustomPostCreate;

方式二:扩展React-Admin表单组件(进阶)

如果你想保留react-admin表单的原有功能(如自动加载编辑页面的初始数据、和dataProvider的自动交互),可以通过高阶组件或自定义表单组件,将Formik的验证逻辑注入到react-admin的表单系统中。

核心思路是:

  • 自定义一个继承自react-admin <Form>组件的容器
  • 在容器内部初始化Formik实例,同步react-admin的表单状态和Formik状态
  • 为内部输入组件传递Formik的验证错误信息

这种方式需要对react-admin的表单生命周期有一定了解,适合需要深度定制的场景。

额外提醒

React-Admin本身集成了基于react-hook-form的表单验证系统,如果你不是特别依赖Formik的特定特性(如熟悉的API、第三方插件生态),可以优先尝试官方的验证方案,更贴合框架生态:

import { SimpleForm, TextInput, Create } from 'react-admin';

// 自定义验证函数
const validatePost = (values) => {
  const errors = {};
  if (!values.title) errors.title = '标题不能为空';
  if (!values.body) errors.body = '内容不能为空';
  return errors;
};

const PostCreate = () => (
  <Create>
    <SimpleForm validate={validatePost}>
      <TextInput source="title" />
      <TextInput source="body" multiline />
    </SimpleForm>
  </Create>
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:57:07