A React component that allows you to create an editable area in your application. It's perfect for situations where you need to provide a user-friendly, in-place editing functionality.
Install via npm
npm install --save react-basic-contenteditableor yarn
yarn add react-basic-contenteditableLive demo at https://chrisuser.github.io/react-basic-contenteditable/
import ContentEditable from "react-basic-contenteditable"
const App = () => {
const [content, setContent] = useState("")
return (
<div>
<div>{content}</div>
<ContentEditable
placeholder="Type here"
containerClassName="container-class"
contentEditableClassName="contenteditable-class"
placeholderClassName="placeholder-class"
onChange={(content) => setContent(content)}
/>
</div>
)
}
export default AppThe component supports forwardRef to expose an imperative handle for programmatic control.
import { useRef } from "react"
import ContentEditable from "react-basic-contenteditable"
import type { ContentEditableHandle } from "react-basic-contenteditable"
const App = () => {
const editorRef = useRef<ContentEditableHandle>(null)
return (
<>
<ContentEditable ref={editorRef} placeholder="Type here" />
<button onClick={() => editorRef.current?.focus()}>Focus</button>
<button onClick={() => editorRef.current?.insertAtCaret("๐")}>
Insert emoji
</button>
<button onClick={() => editorRef.current?.clear()}>Clear</button>
</>
)
}Available methods:
| Method | Return | Description |
|---|---|---|
focus() |
void |
Focuses the editable element |
blur() |
void |
Removes focus from the editable element |
insertAtCaret(text) |
void |
Inserts text at the current cursor position |
clear() |
void |
Clears all content |
getCaretPosition() |
number |
Returns the current cursor offset |
All props are optional, that's how you can fully customize it!
| Name | Optional | Type | Description |
|---|---|---|---|
| containerClassName | โ๏ธ | string |
Custom classes for the wrapper div |
| contentEditableClassName | โ๏ธ | string |
Custom classes for the input element |
| placeholderClassName | โ๏ธ | string |
Custom classes for the placeholder text |
| charsCounterClassName | โ๏ธ | string |
Custom classes for the character counter text (if maxLength is specified) |
| placeholder | โ๏ธ | string |
Input placeholder text |
| disabled | โ๏ธ | boolean |
Flag that disables the input element |
| maxLength | โ๏ธ | number |
Indicates the maximum number of characters a user can enter |
| autoFocus | โ๏ธ | boolean |
Flag to automatically focus the input element on mount |
| tagName | โ๏ธ | string |
HTML tag for the editable element (default: "div") |
| multiLine | โ๏ธ | boolean |
Allow multi-line input (default: true). Set to false for single-line |
| sanitize | โ๏ธ | (content: string) => string |
Callback to sanitize content before onChange fires |
| updatedContent | โ๏ธ | string |
Text injected from parent element into the input as the current value |
| onContentExternalUpdate | โ๏ธ | (content) => void |
Method that emits the injected content by the updatedContent prop |
| onChange | โ๏ธ | (content, meta?) => void |
Emits current content and optional { caretPosition } metadata |
| onKeyUp | โ๏ธ | (e) => void |
Method that emits the keyUp keyboard event |
| onKeyDown | โ๏ธ | (e) => void |
Method that emits the keyDown keyboard event |
| onFocus | โ๏ธ | (e) => void |
Method that emits the focus event |
| onBlur | โ๏ธ | (e) => void |
Method that emits the blur event |
| onPaste | โ๏ธ | (e) => void |
Method that emits the paste event |
The component also accepts any standard HTML attribute (id, data-*, tabIndex, spellCheck, style, className, etc.) which will be forwarded to the editable element.
The package exports the following TypeScript types:
import type { ContentEditableHandle, ContentEditableProps } from "react-basic-contenteditable"- Undo:
Ctrl + Z(Windows/Linux) /Cmd + Z(macOS) - Redo:
Ctrl + Y/Ctrl + Shift + Z(Windows/Linux) /Cmd + Shift + Z(macOS)
If you have a suggestion that would make this component better feel free to fork the project and open a pull request or create an issue for any idea or bug you find.
Remeber to follow the Contributing Guidelines.
React Basic Contenteditable is MIT licensed.
