У меня есть компонент React Dropzone, который берет изображение, загружает его и затем ссылается на это изображение как
Я могу отлично настроить пользовательский элемент в DraftJS, но моя проблема в том, что пользователь может выбрать и удалить эту сущность, я хочу, чтобы сущность всегда существовала и была неподвижной и не удаляемой.
Это мой компонент:
export const ContentItemInlineTextImage = (props: IContentItemTextProps) => {
const { onChange } = props
const imageUrl = props.value && !strIsNullOrEmpty(props.value.imageUrl) ? props.value.imageUrl : "https://cdn.bulbagarden.net/upload/thumb/0/0d/025Pikachu.png/1200px-025Pikachu.png"
const blockRenderMap = Immutable.Map<DraftBlockType, DraftBlockRenderConfig>({
'header-two': {
element: 'h2'
},
'unstyled': {
element: 'div'
}
} as any);
const rawContent = {
blocks: [
{
text: (
'1Enter Text Here'
),
type: 'unstyled',
entityRanges: [{ offset: 0, length: 1, key: 'first' }],
},
],
entityMap: {
first: {
type: 'TOKEN',
mutability: 'IMMUTABLE',
}
},
};
const ImageArea = (props:any) => {
return (
<div style={{float: 'right'}}>
<ContentItemImage imageUrl={imageUrl} onChange={(url)=> {
onChange({
imageUrl: url,
text: ""
})
}} />
</div>
);
};
function getEntityStrategy(mutability: any) {
return function (contentBlock: any, callback: any, contentState: any) {
contentBlock.findEntityRanges(
(character: any) => {
const entityKey = character.getEntity();
if (entityKey === null) {
return false;
}
return contentState.getEntity(entityKey).getMutability() === mutability;
},
callback
);
};
}
const decorator = new CompositeDecorator([
{
strategy: getEntityStrategy('IMMUTABLE'),
component: ImageArea,
},
{
strategy: getEntityStrategy('MUTABLE'),
component: ImageArea,
},
{
strategy: getEntityStrategy('SEGMENTED'),
component: ImageArea,
},
]);
const blocks = convertFromRaw(rawContent as any);
const [editorState, setEditorState] = React.useState<EditorState>(EditorState.createWithContent(blocks, decorator))
return <>
<Editor
blockRenderMap={blockRenderMap as any}
blockRendererFn={(block) => {
console.log(block)
}}
editorState={editorState} onChange={(state) => {
setEditorState(state)
}} />
</>
}
редактирование:
Я исследую это в onChange:
onChange={(state) => {
const raw = convertToRaw(state.getCurrentContent())
onChange({
imageUrl: imageUrl,
text: raw.blocks[0].text
})
// как-то мутируем состояние ...
setEditorState (состояние)
}} />
Так что я могу перехватывать изменения, когда меняются диапазоны сущностей - что я хотел бы сделать, это удалить все диапазоны сущностей из raw.blocks [0] .text - есть ли способ, которым я могу легко сделать это с помощью API draftjs или мне нужно вручную удалить диапазоны сущностей, используя строковые утилиты javascript?
Я также не уверен, как можно предотвратить выбор или удаление диапазона сущностей, делая это ..