Draft.js. Как я могу позже обновить блок atomic:image src, например, сохранить статью?

У меня проблемы с обновлением блоков изображений в editorState в draft.js. Я хочу изменить атомное: src изображения на кнопку сохранить. Таким образом, src, например, теперь blob: http://localhost:3000/7661d307-871b-4039-b7dd-6efc2701b623 но я хотел бы обновить src, например, до /uploads-from-my-server/test.png

onSave(e) {
 e.preventDefault();
 const { editorState } = this.state;
 const contentState = editorState.getCurrentContent();

 editorState.getCurrentContent().getBlockMap().map((block) => {
  const type = block.getType();

  if (type === 'atomic:image') {
    const rangeToReplace = new SelectionState({
      anchorKey: block.getKey(),
      focusKey: block.getKey(),
    });

    Modifier.replaceText(contentState, rangeToReplace, '/uploads-from-my-server/test.png');
    const newContentState = editorState.getCurrentContent();
    this.setState({ editorState: newContentState });
  }

  return true;
});

Я знаю, что могу получить доступ к строке src с помощью block.getData(). Get('src'), но не могу установить

Спасибо за ваш замечательный редактор

1 ответ

Я боролся с подобной проблемой, я закончил преобразование состояния содержимого в необработанный массив, используя convertToRaw а затем обновить его вручную и использовать convertFromRaw и установите новое состояние:

import {EditorState, ContentState, convertToRaw, convertFromRaw /*, ...*/} from 'draft-js';

// ...

onSave(e) {
  e.preventDefault();
  const { editorState } = this.state;
  const contentState = editorState.getCurrentContent();

  let rawContent = convertToRaw(contentState);

  for(let i = 0; i < rawContent.blocks.length; i++) {
      let b = rawContent.blocks[i];
      if(b['type'] !== "unstyled" && b.entityRanges.length === 1) {
        const entityKey = b['entityRanges'][0]['key'];
        const entityMap = rawContent['entityMap'][entityKey];
        if(entityMap["type"] === "image") {
          rawContent['entityMap'][entityKey]['data']['src'] = '/uploads-from-my-server/test.png';         
        }
      }      
  } 

  const newContentState = convertFromRaw(rawContent);  
  const newEditorState = EditorState.push(this.state.editorState, newContentState, 'update-contentState');
  this.setState({editorState: newEditorState});
}

Примечание: это не полностью рабочий пример, это просто отправная точка. Надеюсь, поможет:)

Другие вопросы по тегам