Пробелы неправильно распознаются в редакторе TipTap

В нашем проекте мы используем редактор форматированного текста TipTap.
Но у нас есть проблема, что пробелы не распознаются правильно и только после каждых 2 щелчков создается пробел. В качестве фреймворка мы используем Vue.JS.

import { Editor, EditorContent, EditorMenuBar } from 'tiptap'
import {
  HardBreak,
  Heading,
  OrderedList,
  BulletList,
  ListItem,
  Bold,
  Italic,
  History
} from 'tiptap-extensions'
import EditorMenuButton from './EditorMenuButton.vue'
export default {
  name: 'editor',
  components: {
    EditorMenuButton,
    EditorMenuBar,
    EditorContent
  },
  props: {
    value: {
      type: null,
      default: ' '
    }
  },
  data () {
    return {
      innerValue: ' ',
      editor: new Editor({
        extensions: [
          new HardBreak(),
          new Heading({ levels: [1, 2, 3] }),
          new BulletList(),
          new OrderedList(),
          new ListItem(),
          new Bold(),
          new Italic(),
          new History()
        ],
        content: `${this.innerValue}`,
        onUpdate: ({ getHTML }) => {
          this.innerValue = getHTML()
        }
      })
    }
  },
  watch: {
    // Handles internal model changes.
    innerValue (newVal) {
      this.$emit('input', newVal)
    },
    // Handles external model changes.
    value (newVal) {
      this.innerValue = newVal
      this.editor.setContent(this.innerValue)
    }
  },
  mounted () {
    if (this.value) {
      this.innerValue = this.value
      this.editor.setContent(this.innerValue)
    }
  },
  beforeDestroy () {
    this.editor.destroy()
  }
}
</script>

Кто-нибудь знает, в чем может быть причина использования только каждых двух пробелов?

7 ответов

У нас была такая же проблема, мы сохранили onUpdate триггер, но изменил часы так, чтобы они вызывали только editor.setContent когда значение действительно было другим.

        watch: {
    value() {
      let html = this.editor.getHTML();
      if (html !== this.value) {
        this.editor.setContent(this.value);
      }
    },
  },

Удалите раздел onUpdate, и ошибка исчезнет. Не знаю почему, но интересно узнать, как воспроизвести ошибку.

Это действительно помогает. Следуя этому совету, я сейчас используюonBlur событие вместо onUpdate, при получении HTML содержимого с помощью экземпляра редактора и getHTML() функция, как таковая: this.editor.getHTML().

(В моем случае я $emit это значение, чтобы он реагировал на мой родительский компонент, но это может не иметь отношения к исходному вопросу).

«Хорошо, проблема в том, что наблюдатель запускается, когда вы вводите текст в редакторе. Таким образом, это проверяет, находится ли редактор в фокусе, и обновляет только содержимое редактора, если это не так».

       watch: {
    value(val) {
      if (!this.editor.focused) {
        this.editor.setContent(val, false);
      }
    }
  },

проблема: https://github.com/ueberdosis/tiptap/issues/776#issuecomment-667077233

Может быть, вам стоит попробовать это.

      watch: {
    // Handles external model changes.
    value (newVal) {
        // convert whitespace into \u00a0 -> &nbsp;
        let content = newVal.replace(/\s/g, "\u00a0");
        this.editor.setContent(content)
    }
},

Кажется, что обычное пустое пространство было удалено html автоматически. Поэтому я конвертирую пробелы в 'nbsp;' и это сработало.

Эта ошибка для меня была вызвана чем-то вроде этого:

  watch: {
    value: {
      immediate: true,
      handler(newValue) {
        this.editor.setContent(newValue)
      },
    },
  },

Это полностью удалено, и ошибка исчезла. Может быть, это кому-то поможет в будущем.

Удалите раздел onUpdate, и ошибка исчезнет. Не знаю почему, но интересно узнать, как воспроизвести ошибку. Однако, если вы создадите "минимальный воспроизводимый пример", ошибка не появится. И что? Я не знаю.

Я нашел обходной путь - использовать vuex.

Вместо того, чтобы присваивать значение, возвращаемое getHTML() в переменной innerValue, а затем выдавать событие input, я помещаю это значение в хранилище.

Код, который вы предоставили, похоже, работает нормально. Таким образом, проблема, скорее всего, вызвана побочным эффектом в вашем коде или какой-либо зависимостью.

Чтобы отладить эту проблему, вы можете искать прослушиватели событий, особенно в отношении событий нажатия или нажатия клавиши, и смотреть, проверяете ли вы пробел специально где-то (event.keyCode === 32 или event.key === " "). В сочетании сevent.preventDefault это могло бы объяснить такую ​​проблему.

Еще один более широкий способ отладки - убирать части из кода до тех пор, пока ошибка не исчезнет, ​​или добавлять к минимальному примеру, пока ошибка не появится.

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