React Hooks
Payload provides a variety of powerful React Hooks that can be used within your own Custom Components, such as Custom Fields. With them, you can interface with Payload itself to build just about any type of complex customization you can think of.
useField
The useField
hook is used internally within all field components. It manages sending and receiving a field's state from its parent form. When you build a Custom Field Component, you will be responsible for sending and receiving the field's value
to and from the form yourself.
To do so, import the useField
hook as follows:
The useField
hook accepts the following arguments:
Property | Description |
---|---|
path | If you do not provide a path or a name , this hook will look for one using the useFieldProps hook. |
validate | A validation function executed client-side before submitting the form to the server. Different than Field-level Validation which runs strictly on the server. |
disableFormData | If true , the field will not be included in the form data when the form is submitted. |
hasRows | If true , the field will be treated as a field with rows. This is useful for fields like array and blocks . |
The useField
hook returns the following object:
useFieldProps
Custom Field Components can be rendered on the server. When using a server component as a custom field component, you can access dynamic props from within any client component rendered by your custom server component. This is done using the useFieldProps
hook. This is important because some fields can be dynamic, such as when nested in an array
or blocks
field. For example, items can be added, re-ordered, or deleted on-the-fly.
You can use the useFieldProps
hooks to access dynamic props like path
:
useFormFields
There are times when a custom field component needs to have access to data from other fields, and you have a few options to do so. The useFormFields
hook is a powerful and highly performant way to retrieve a form's field state, as well as to retrieve the dispatchFields
method, which can be helpful for setting other fields' form states from anywhere within a form.
Thanks to the awesome package use-context-selector
, you can retrieve a specific field's state easily. This is ideal because you can ensure you have an up-to-date field state, and your component will only re-render when that field's state changes.
You can pass a Redux-like selector into the hook, which will ensure that you retrieve only the field that you want. The selector takes an argument with type of [fields: Fields, dispatch: React.Dispatch<Action>]]
.
useAllFormFields
To retrieve more than one field, you can use the useAllFormFields
hook. Your component will re-render when any field changes, so use this hook only if you absolutely need to. Unlike the useFormFields
hook, this hook does not accept a "selector", and it always returns an array with type of [fields: Fields, dispatch: React.Dispatch<Action>]]
.
You can do lots of powerful stuff by retrieving the full form state, like using built-in helper functions to reduce field state to values only, or to retrieve sibling data by path.
Updating other fields' values
If you are building a Custom Component, then you should use setValue
which is returned from the useField
hook to programmatically set your field's value. But if you're looking to update another field's value, you can use dispatchFields
returned from useFormFields
.
You can send the following actions to the dispatchFields
function.
Action | Description |
---|---|
ADD_ROW | Adds a row of data (useful in array / block field data) |
DUPLICATE_ROW | Duplicates a row of data (useful in array / block field data) |
MODIFY_CONDITION | Updates a field's conditional logic result (true / false) |
MOVE_ROW | Moves a row of data (useful in array / block field data) |
REMOVE | Removes a field from form state |
REMOVE_ROW | Removes a row of data from form state (useful in array / block field data) |
REPLACE_STATE | Completely replaces form state |
UPDATE | Update any property of a specific field's state |
To see types for each action supported within the dispatchFields
hook, check out the Form types here.
useForm
The useForm
hook can be used to interact with the form itself, and sends back many methods that can be used to reactively fetch form state without causing rerenders within your components each time a field is changed. This is useful if you have action-based callbacks that your components fire, and need to interact with form state based on a user action.
The useForm
hook returns an object with the following properties:
Action | Description | Example |
---|---|---|
fields | Deprecated. This property cannot be relied on as up-to-date. | |
submit | Method to trigger the form to submit | |
dispatchFields | Dispatch actions to the form field state | |
validateForm | Trigger a validation of the form state | |
createFormData | Create a multipart/form-data object from the current form's state | |
disabled | Boolean denoting whether or not the form is disabled | |
getFields | Gets all fields from state | |
getField | Gets a single field from state by path | |
getData | Returns the data stored in the form | |
getSiblingData | Returns form sibling data for the given field path | |
setModified | Set the form\'s modified state | |
setProcessing | Set the form\'s processing state | |
setSubmitted | Set the form\'s submitted state | |
formRef | The ref from the form HTML element | |
reset | Method to reset the form to its initial state | |
addFieldRow | Method to add a row on an array or block field | |
removeFieldRow | Method to remove a row from an array or block field | |
replaceFieldRow | Method to replace a row from an array or block field |
useCollapsible
The useCollapsible
hook allows you to control parent collapsibles:
Property | Description |
---|---|
isCollapsed | State of the collapsible. true if open, false if collapsed. |
isVisible | If nested, determine if the nearest collapsible is visible. true if no parent is closed, false otherwise. |
toggle | Toggles the state of the nearest collapsible. |
isWithinCollapsible | Determine when you are within another collapsible. |
Example:
useDocumentInfo
The useDocumentInfo
hook provides lots of information about the document currently being edited, including the following:
Property | Description |
---|---|
collection | If the doc is a collection, its Collection Config will be returned |
global | If the doc is a global, its Global Config will be returned |
id | If the doc is a collection, its ID will be returned |
preferencesKey | The preferences key to use when interacting with document-level user preferences |
versions | Versions of the current doc |
unpublishedVersions | Unpublished versions of the current doc |
publishedDoc | The currently published version of the doc being edited |
getVersions | Method to trigger the retrieval of document versions |
docPermissions | The current documents permissions. Collection document permissions fallback when no id is present (i.e. on create) |
getDocPermissions | Method to trigger the retrieval of document level permissions |
Example:
useLocale
In any Custom Component you can get the selected locale object with the useLocale
hook. useLocale
gives you the full locale object, consisting of a label
, rtl
(right-to-left) property, and then code
. Here is a simple example:
useAuth
Useful to retrieve info about the currently logged in user as well as methods for interacting with it. It sends back an object with the following properties:
Property | Description |
---|---|
user | The currently logged in user |
logOut | A method to log out the currently logged in user |
refreshCookie | A method to trigger the silent refreshing of a user's auth token |
setToken | Set the token of the user, to be decoded and used to reset the user and token in memory |
token | The logged in user's token (useful for creating preview links, etc.) |
refreshPermissions | Load new permissions (useful when content that effects permissions has been changed) |
permissions | The permissions of the current user |
useConfig
Used to easily retrieve the Payload Client Config.
useEditDepth
Sends back how many editing levels "deep" the current component is. Edit depth is relevant while adding new documents / editing documents in modal windows and other cases.
usePreferences
Returns methods to set and get user preferences. More info can be found here.
useTheme
Returns the currently selected theme (light
, dark
or auto
), a set function to update it and a boolean autoMode
, used to determine if the theme value should be set automatically based on the user's device preferences.
useTableColumns
Returns methods to manipulate table columns
useTableCell
Similar to useFieldProps
, all Custom Cell Components are rendered on the server, and as such, only have access to static props at render time. But, some props need to be dynamic, such as the field value itself.
For this reason, dynamic props like cellData
are managed in their own React context, which can be accessed using the useTableCell
hook.
useDocumentEvents
The useDocumentEvents
hook provides a way of subscribing to cross-document events, such as updates made to nested documents within a drawer. This hook will report document events that are outside the scope of the document currently being edited. This hook provides the following:
Property | Description |
---|---|
mostRecentUpdate | An object containing the most recently updated document. It contains the entitySlug , id (if collection), and updatedAt properties |
reportUpdate | A method used to report updates to documents. It accepts the same arguments as the mostRecentUpdate property. |
Example: