Выделите текст в Draft.js декоратор onClick on декоратор для реализации перетаскивания

#javascript #reactjs #contenteditable #draftjs

#javascript #reactjs #contenteditable #draftjs

Вопрос:

Я пытаюсь реализовать функциональность, которая позволит мне перетаскивать оформленный текст в Draft.js редактор и потратили пару дней мозговых усилий на эту проблему.

Синие подсветки — это аккорды в тексте, и моя цель — настроить их положение в тексте.

введите описание изображения здесь

Моя стратегия

  • отметьте текст в декораторе onClick при нажатии на декоратор
  • переместите выделенный текст вокруг

Я знаю, что я создаю условие гонки в Draft.js но я не знаю, как решить эту проблему.

Код

У меня есть настроенный тест, который доступен на Github.
https://github.com/tobi-or-not/draft-js-experiments

Сценарий 1:

Я нажимаю кнопку в том же компоненте, который отображает редактор. Это работает отлично. После нажатия кнопки часть текста будет выделена

Сценарий 2:

Я нажимаю на декоратор. После щелчка редактор возвращается в исходное состояние

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

Ответ №1:

Я наткнулся на комментарий к Draft.js Слабина, которая указала мне правильное направление.

Вы только передаете декоратор в начальное состояние, но:

  • Декоратор закрывает компонент кнопки (в ПЕРВОМ визуализированном экземпляре, а не в текущем экземпляре)
  • Компонент Button имеет закрытие для clickFn (в том же ПЕРВОМ визуализированном экземпляре)
  • clickFn имеет закрытие для editorState (угадайте, что … в том же ПЕРВОМ экземпляре, который был отображен)

Поэтому ваш clickFn всегда обновляет исходное состояние, а не текущее состояние Mindfuck, не так ли? В основном вам нужно будет обновлять декоратор с каждым обновлением, чтобы все было правильно связано с предыдущим состоянием. Все это вызвано тем фактом, что DraftJS EditorState — это не просто объект данных, но и включает побочные эффекты через декоратор.
Вероятно, самый простой выход из этого — использовать старые добрые компоненты класса, чтобы замыкания каждый раз указывали на один и тот же объект, а не на новый.

И это то, что я сделал. Компонент, содержащий Draft.js редактор теперь является компонентом класса. Код доступен на GitHub.