Skip to main content
Refine provides CRUD components that handle the layout and common functionality for data management pages. These components work consistently across all UI frameworks.

List

The List component provides a layout for displaying lists of records with automatic header, breadcrumb, and action buttons.

Basic Usage

import { List, useTable } from "@refinedev/antd";
import { Table } from "antd";

export const ProductList = () => {
  const { tableProps } = useTable();

  return (
    <List>
      <Table {...tableProps} rowKey="id">
        <Table.Column dataIndex="id" title="ID" />
        <Table.Column dataIndex="name" title="Name" />
        <Table.Column dataIndex="price" title="Price" />
      </Table>
    </List>
  );
};

Props

PropTypeDescription
titleReactNodeCustom page title
resourcestringResource name (auto-detected from route)
canCreatebooleanShow/hide create button
createButtonPropsobjectProps for the create button
breadcrumbReactNodeCustom breadcrumb component
headerButtonsReactNode | functionCustom header buttons
headerButtonPropsobjectProps for header button container
wrapperPropsobjectProps for wrapper element
contentPropsobjectProps for content element

Custom Header Buttons

import { List, ExportButton, CreateButton } from "@refinedev/antd";
import { Button, Space } from "antd";

export const ProductList = () => {
  return (
    <List
      headerButtons={({ defaultButtons }) => (
        <Space>
          {defaultButtons}
          <ExportButton />
          <Button>Custom Action</Button>
        </Space>
      )}
    >
      {/* Content */}
    </List>
  );
};

Create

The Create component provides a layout for creating new records with automatic save button and navigation.

Basic Usage

import { Create, useForm } from "@refinedev/antd";
import { Form, Input, InputNumber } from "antd";

export const ProductCreate = () => {
  const { formProps, saveButtonProps } = useForm();

  return (
    <Create saveButtonProps={saveButtonProps}>
      <Form {...formProps} layout="vertical">
        <Form.Item label="Name" name="name" rules={[{ required: true }]}>
          <Input />
        </Form.Item>
        <Form.Item label="Price" name="price" rules={[{ required: true }]}>
          <InputNumber style={{ width: "100%" }} />
        </Form.Item>
      </Form>
    </Create>
  );
};

Props

PropTypeDescription
titleReactNodeCustom page title
resourcestringResource name (auto-detected from route)
saveButtonPropsobjectProps for the save button
isLoadingbooleanLoading state
breadcrumbReactNodeCustom breadcrumb component
headerButtonsReactNode | functionCustom header buttons
footerButtonsReactNode | functionCustom footer buttons
goBackReactNodeCustom back button
wrapperPropsobjectProps for wrapper element
contentPropsobjectProps for content element
headerPropsobjectProps for header element
footerButtonPropsobjectProps for footer button container
import { Create, SaveButton } from "@refinedev/antd";
import { Button, Space } from "antd";

export const ProductCreate = () => {
  const { formProps, saveButtonProps } = useForm();

  return (
    <Create
      footerButtons={({ defaultButtons }) => (
        <Space>
          <Button>Preview</Button>
          {defaultButtons}
        </Space>
      )}
    >
      {/* Form */}
    </Create>
  );
};

Edit

The Edit component provides a layout for editing existing records with automatic data fetching and save button.

Basic Usage

import { Edit, useForm } from "@refinedev/antd";
import { Form, Input, InputNumber } from "antd";

export const ProductEdit = () => {
  const { formProps, saveButtonProps, queryResult } = useForm();

  return (
    <Edit saveButtonProps={saveButtonProps}>
      <Form {...formProps} layout="vertical">
        <Form.Item label="ID" name="id">
          <Input disabled />
        </Form.Item>
        <Form.Item label="Name" name="name" rules={[{ required: true }]}>
          <Input />
        </Form.Item>
        <Form.Item label="Price" name="price" rules={[{ required: true }]}>
          <InputNumber style={{ width: "100%" }} />
        </Form.Item>
      </Form>
    </Edit>
  );
};

Props

Same as Create component, plus:
PropTypeDescription
recordItemIdstring | numberRecord ID to edit
canDeletebooleanShow/hide delete button
deleteButtonPropsobjectProps for the delete button

With Delete Button

import { Edit, useForm, DeleteButton } from "@refinedev/antd";

export const ProductEdit = () => {
  const { formProps, saveButtonProps, queryResult } = useForm();
  const id = queryResult?.data?.data?.id;

  return (
    <Edit
      saveButtonProps={saveButtonProps}
      headerButtons={({ defaultButtons }) => (
        <>
          {defaultButtons}
          <DeleteButton recordItemId={id} />
        </>
      )}
    >
      {/* Form */}
    </Edit>
  );
};

Show

The Show component provides a layout for displaying a single record in read-only mode.

Basic Usage

import { Show, TextField, NumberField } from "@refinedev/antd";
import { useShow } from "@refinedev/core";
import { Typography } from "antd";

const { Title } = Typography;

export const ProductShow = () => {
  const { queryResult } = useShow();
  const { data, isLoading } = queryResult;
  const record = data?.data;

  return (
    <Show isLoading={isLoading}>
      <Title level={5}>ID</Title>
      <TextField value={record?.id} />

      <Title level={5}>Name</Title>
      <TextField value={record?.name} />

      <Title level={5}>Price</Title>
      <NumberField
        value={record?.price}
        options={{ style: "currency", currency: "USD" }}
      />
    </Show>
  );
};

Props

PropTypeDescription
titleReactNodeCustom page title
resourcestringResource name (auto-detected from route)
recordItemIdstring | numberRecord ID to show
isLoadingbooleanLoading state
canEditbooleanShow/hide edit button
canDeletebooleanShow/hide delete button
breadcrumbReactNodeCustom breadcrumb component
headerButtonsReactNode | functionCustom header buttons
footerButtonsReactNode | functionCustom footer buttons
goBackReactNodeCustom back button

With Action Buttons

import { Show, EditButton, DeleteButton, RefreshButton } from "@refinedev/antd";
import { Space } from "antd";

export const ProductShow = () => {
  const { queryResult } = useShow();
  const id = queryResult?.data?.data?.id;

  return (
    <Show
      headerButtons={({ defaultButtons, editButtonProps, deleteButtonProps }) => (
        <Space>
          {defaultButtons}
          <EditButton {...editButtonProps} />
          <DeleteButton {...deleteButtonProps} />
          <RefreshButton />
        </Space>
      )}
    >
      {/* Content */}
    </Show>
  );
};

Advanced Features

Modal/Drawer Forms

Use modal or drawer for create/edit operations:

Auto-Save Forms

Enable auto-save for forms:
import { Edit, useForm, AutoSaveIndicator } from "@refinedev/antd";
import { Form, Input } from "antd";

export const ProductEdit = () => {
  const { formProps, autoSaveProps } = useForm({
    autoSave: {
      enabled: true,
      debounce: 2000, // Save after 2 seconds of inactivity
    },
  });

  return (
    <Edit
      headerButtons={() => <AutoSaveIndicator {...autoSaveProps} />}
    >
      <Form {...formProps} layout="vertical">
        <Form.Item label="Name" name="name">
          <Input />
        </Form.Item>
      </Form>
    </Edit>
  );
};

Best Practices

  1. Consistent Layouts: Use CRUD components for consistent UI
  2. Loading States: Always show loading indicators
  3. Error Handling: Display validation errors clearly
  4. Breadcrumbs: Help users navigate back
  5. Action Buttons: Provide clear calls-to-action
  6. Responsive Design: Test on mobile devices

Next Steps

Field Components

Display data with field components

Button Components

Add action buttons

Forms

Learn about form hooks

Tables

Work with table data

Build docs developers (and LLMs) love