1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-08-15 03:33:59 +02:00

Make Editable accept 'as' prop (#3288)

* allow passing 'as' prop to render custom component

* Update editable.tsx
This commit is contained in:
Eddy Wilson
2019-12-10 15:09:58 -06:00
committed by Ian Storm Taylor
parent faf73d4521
commit 5bddee673f

View File

@@ -57,22 +57,27 @@ export interface RenderLeafProps {
}
}
/**
* `EditableProps` are passed to the `<Editable>` component.
*/
export type EditableProps = {
decorate?: (entry: NodeEntry) => Range[]
onDOMBeforeInput?: (event: Event) => void
placeholder?: string
readOnly?: boolean
role?: string
style?: React.CSSProperties
renderElement?: (props: RenderElementProps) => JSX.Element
renderLeaf?: (props: RenderLeafProps) => JSX.Element
as?: React.ElementType
} & React.TextareaHTMLAttributes<HTMLDivElement>
/**
* Editable.
*/
export const Editable = (
props: {
decorate?: (entry: NodeEntry) => Range[]
onDOMBeforeInput?: (event: Event) => void
placeholder?: string
readOnly?: boolean
role?: string
style?: React.CSSProperties
renderElement?: (props: RenderElementProps) => JSX.Element
renderLeaf?: (props: RenderLeafProps) => JSX.Element
} & React.TextareaHTMLAttributes<HTMLDivElement>
) => {
export const Editable = (props: EditableProps) => {
const {
autoFocus,
decorate = defaultDecorate,
@@ -82,6 +87,7 @@ export const Editable = (
renderElement,
renderLeaf,
style = {},
as: Component = 'div',
...attributes
} = props
const editor = useSlate()
@@ -400,7 +406,7 @@ export const Editable = (
return (
<ReadOnlyContext.Provider value={readOnly}>
<div
<Component
// COMPAT: The Grammarly Chrome extension works by changing the DOM
// out from under `contenteditable` elements, which leads to weird
// behaviors so we have to disable it like editor. (2017/04/24)
@@ -887,7 +893,7 @@ export const Editable = (
renderLeaf={renderLeaf}
selection={editor.selection}
/>
</div>
</Component>
</ReadOnlyContext.Provider>
)
}