Skip to contents

useRender

Hook for enabling a render prop in custom components.

View as Markdown

The useRender hook lets you build custom components that provide a render prop to override the default rendered element.

Examples

A render prop for a custom Text component lets consumers use it to replace the default rendered p element with a different tag or component.

Text component rendered as a paragraph tag

Text component rendered as a strong tag

The callback version of the render prop enables more control of how props are spread, and also passes the internal state of a component.

Merging props

The mergeProps function merges two or more sets of React props together. It safely merges three types of props:

  1. Event handlers, so that all are invoked
  2. className strings
  3. style properties

mergeProps merges objects from left to right, so that subsequent objects’ properties in the arguments overwrite previous ones. Merging props is useful when creating custom components, as well as inside the callback version of the render prop for any Base UI component.

Using mergeProps in the render callback

Merging refs

When building custom components, you often need to control a ref internally while still letting external consumers pass their own—merging refs lets both parties have access to the underlying DOM element. The ref option in useRender enables this, which holds an array of refs to be merged together.

In React 19, React.forwardRef() is not needed when building primitive components, as the external ref prop is already contained inside props. Your internal ref can be passed to ref to be merged with props.ref:

React 19

In older versions of React, you need to use React.forwardRef() and add the forwarded ref to the ref array along with your own internal ref.

The examples above assume React 19, and should be modified to use React.forwardRef() to support React 18 and 17.

React 18 and 17

TypeScript

To type props, there are two interfaces:

  • useRender.ComponentProps for a component’s external (public) props. It types the render prop and HTML attributes.
  • useRender.ElementProps for the element’s internal (private) props. It types HTML attributes alone.
Typing props

Migrating from Radix UI

Radix UI uses an asChild prop, while Base UI uses a render prop. Learn more about how composition works in Base UI in the composition guide.

In Radix UI, the Slot component lets you implement an asChild prop.

Radix UI Slot component

In Base UI, useRender lets you implement a render prop. The example below is the equivalent implementation to the Radix example above.

Base UI render prop

API reference

Usage
render*
ReactElement | function
Name
Description

The React element or a function that returns one to override the default element.

Type
ref*
Union
Name
Description

The ref to apply to the rendered element.

Type
state*
Record<string, unknown>
Name
Description

The state of the component, passed as the second argument to the render callback. State properties are automatically converted to data-* attributes.

Type
Record<string, unknown> | undefined
stateAttributesMapping*
StateAttributesMapping<Record<string, unknown>>
Description

Custom mapping for converting state properties to data-* attributes.

Type
StateAttributesMapping<Record<string, unknown>> | undefined
Example

{ isActive: (value) => (value ? { ‘data-is-active’: ‘’ } : null) }

props*
Record<string, unknown>
Name
Description

Props to be spread on the rendered element. They are merged with the internal props of the component, so that event handlers are merged, className strings and style properties are joined, while other external props overwrite the internal ones.

Type
Record<string, unknown> | undefined
enabled*
boolean
Description

If false, the hook will skip most of its internal logic and return null. This is useful for rendering a component conditionally.

Type
boolean | undefined
Default
true
defaultTagName*
Union
Description

The default tag name to use for the rendered element when render is not provided.

Type
Default
'div'

Return value

ReactElement | null

Additional Types

useRender.ComponentProps
useRender.ElementProps
useRender.Parameters
useRender.RenderProp
useRender.ReturnValue
HTMLProps
UseRenderComponentProps
UseRenderElementProps
UseRenderParameters
UseRenderRenderProp
UseRenderReturnValue