<FunctionField>
If you need a special function to render a field, <FunctionField>
is the perfect match. It executes a render
function using the current record as parameter.
Usage
<FunctionField>
requires a render
prop, which is a function that takes the current record as argument and returns a string or an element.
For instance, to display the full name of a user
record based on first_name
and last_name
properties:
import { List, Datagrid, FunctionField } from 'react-admin';
const UserList = () => (
<List>
<Datagrid>
<FunctionField
source="last_name"
render={record => `${record.first_name} ${record.last_name}`}
/>
...
</Datagrid>
</List>
);
Theoretically, you can omit the source
for the <FunctionField>
since you provide the render function. However, when used inside a <Datagrid>
, providing the source
prop (or the sortBy
prop) is required to make the column sortable. When a user clicks on a column, <Datagrid>
uses these properties to sort the data.
<FunctionField>
is based on the useRecordContext
hook.
Props
Prop | Required | Type | Default | Description |
---|---|---|---|---|
render |
Required | function | - | A function returning a string (or an element) to display based on a record |
<FunctionField>
also accepts the common field props.
render
The render
prop accepts a function that takes the current record as argument and returns a string or an element.
// return a string
const render = (record: any) => `${record.first_name} ${record.last_name}`;
// return an element
const render = (record: any) => (
<>{record.first_name} <strong>{record.last_name}</strong></>
);
React-admin wraps the result of the render
function in a <Typography>
component.
Since this function executes in a RecordContext, you can even use other Field components to compute the value:
import { List, Datagrid, FunctionField, TextField } from 'react-admin';
const render = () => (
<span>
<TextField source="first_name" />{' '}
<TextField source="last_name" />
</span>
);
const UserList = () => (
<List>
<Datagrid>
<FunctionField source="last_name" label="Name" render={render} />
...
</Datagrid>
</List>
);
However, if you only need to combine Field components, prefer the <WrapperField>
component for a simpler syntax:
import { List, Datagrid, WrapperField, TextField } from 'react-admin';
const UserList = () => (
<List>
<Datagrid>
<WrapperField label="Name" source="last_name">
<TextField source="first_name" />
<TextField source="last_name" />
</WrapperField>
...
</Datagrid>
</List>
);
TypeScript
To type the record
argument of the render
function, provide the record’s type as a generic parameter to the component:
import { List, Datagrid, FunctionField } from 'react-admin';
interface User {
id: number;
first_name: string;
last_name: string;
}
const UserList = () => (
<List>
<Datagrid>
<FunctionField<User>
source="last_name"
label="Name"
render={record => `${record.first_name} ${record.last_name}`}
/>
...
</Datagrid>
</List>
);