Простые заполнители переменных в Draft.js

Мы пытаемся реализовать переменные заполнители для функции в нашем приложении.

По сути, пользователь создаст шаблон с помощью редактора WYSIWYG и поместит переменные в текст, например:

Hello {{first_name}}

Затем эти переменные будут интерполированы нашей серверной частью (например, замена {{first_name}} на "Peter").

Наши пользователи не являются техническими специалистами, поэтому мы не хотим, чтобы им приходилось добавлять заполнители вручную. Мы хотим, чтобы они перетаскивали переменные в свой текст из предопределенного нами списка.

Есть ли простой способ сделать это с помощью DraftJS или CKDior из коробки?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
2 084
2

Ответы 2

Вы можете создать кнопку следующим образом

  <button
     onMouseDown = {e => this.onAddText(e, '{{first_name}}' )}
  >
     ADD Name
  </button>

и внутри функции onAddText

import { insertText } from 'draft-js-modifiers';

onAddText = (e, text) => {
    e.preventDefault();
    const { editorState } = this.state;
    const EditorStat = insertText(editorState, text);
    this.setState({ editorState: EditorStat });
};

insertText — это метод, предоставляемый draft-js-modifiers.

а затем используйте this.state.editorState следующим образом:

import {
  Editor,
} from 'draft-js';

<Editor
     editorState = {this.state.editorState}
/>

Спасибо за А2А.

У нас было аналогичное требование к функции для добавления шаблонов с заполнителями для рассылки.

Dear {{recipient.first_name}},

  Mail Body Template

With best regards,
{{sender.first_name}} {{sender.last_name}}
Manager - ABC Company.

Вот как мы это реализовали. Надеюсь, это будет полезно.

черновик-js предоставляет класс Модификатор именно для этого варианта использования.

Modifier В API есть метод вставить текст для вставки пользовательского текста-заполнителя в контент — {{first_name}} в вашем случае.

import { EditorState, Modifier } from 'draft-js';

insertPlaceholder = placeholderText => {
  const { editorState } = this.state;

   const newContentState = Modifier.insertText(
      editorState.getCurrentContent(), // get ContentState from EditorState
      editorState.getSelection(),
      placeholderText
    );

    this.setState({
      editorState: EditorState.createWithContent(newContentState); // get EditorState with ContentState
    });
}

Затем добавьте кнопку для запуска метода insertPlaceholder.

<button
  onClick = {() => this.insertPlaceholder('{{first_name}}')}
>
  Add First Name
</button>

При нажатии на Add First Name текст заполнителя будет вставлен в текущая cursor позиция.

Если редактор не в фокусе, текст будет вставлен в начало.

Для повторного использования вы можете создать собственный плагин и включить его в опции. Скриншот примера плагина-заполнителя

Примечание:

Если у вас есть несколько заполнителей, я бы предложил использовать select input с возможными вариантами заполнителей — это сохранит чистоту пользовательского интерфейса, а не кучу кнопок.

Любые предложения приветствуются.

Есть ли способ сделать это с помощью React Hooks?

Aaron Miller 19.08.2020 23:39

Небольшой рефакторинг сделает работу с хуками const [editorState, setEditorState] = useState(defaultEditorState); insertPlaceholder = placeholderText => { const newContentState = Modifier.insertText( editorState.getCurrentContent(), // получить ContentState из EditorState editorState.getSelection(), placeholderText ); setEditorState (EditorState.createWithContent (newContentState‌​)); }

KRRISH96 20.08.2020 18:35

Потрясающий. Кстати, я получил целевой диапазон ошибок, который должен быть свернут для insertText. использование replaceText решает эту проблему

David Kong 09.04.2021 02:45

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