Skip to content

InlineEditable

Headless component for inline editing with render props.

Props

InlineEditableProps<T>

PropTypeRequiredDescription
valueTYesCurrent value
onSave(value: T) => Promise<void> | voidYesSave function
renderDisplay(props: DisplayProps<T>) => ReactNodeYesRender display mode
renderEditor(props: EditorProps<T>) => ReactNodeYesRender edit mode
onCancel() => voidNoCalled when edit cancelled
onSaveSuccess() => voidNoCalled when save succeeds
onSaveError(error: Error) => voidNoCalled when save fails
enableKeyboardShortcutsbooleanNoEnable Enter/Escape (default: true)
classNamestringNoWrapper class

InlineEditableDisplayProps<T>

PropertyTypeDescription
valueTCurrent value
onStartEdit() => voidStart editing

InlineEditableEditorProps<T>

PropertyTypeDescription
valueTCurrent draft value
onChange(value: T) => voidUpdate draft
onSave() => voidSave current value
onCancel() => voidCancel editing
isSavingbooleanWhether save is in progress
errorError | nullError from save attempt
inputProps{ onKeyDown: (e: KeyboardEvent) => void }Props for input

Example

tsx
<InlineEditable
  value={item.name}
  onSave={async (value) => api.update({ name: value })}
  renderDisplay={({ value, onStartEdit }) => (
    <span onClick={onStartEdit}>{value}</span>
  )}
  renderEditor={({ value, onChange, onSave, onCancel, inputProps }) => (
    <input value={value} onChange={(e) => onChange(e.target.value)} {...inputProps} />
  )}
/>

See also