Rich Text редакторы позволяют создавать интерфейсы для редактирования текста с форматированием, включающим шрифты, цвета, списки, ссылки, изображения и другие элементы. В экосистеме Vue.js их интеграция осуществляется через компоненты и двустороннее связывание данных.
Наиболее популярные редакторы для Vue.js:
vue-quill-editor.@ckeditor/ckeditor5-vue.@tinymce/tinymce-vue.Ключевые критерии выбора:
Для Quill:
npm install vue-quill-editor quill
Импорт и регистрация компонента:
import Vue from 'vue';
import VueQuillEditor from 'vue-quill-editor';
import 'quill/dist/quill.core.css';
import 'quill/dist/quill.snow.css';
import 'quill/dist/quill.bubble.css';
Vue.use(VueQuillEditor);
В шаблоне компонента:
<template>
<quill-editor
v-model="content"
:options="editorOptions"
/>
</template>
<script>
export default {
data() {
return {
content: '',
editorOptions: {
theme: 'snow',
placeholder: 'Введите текст...',
modules: {
toolbar: [
['bold', 'italic', 'underline', 'strike'],
['link', 'image'],
[{ list: 'ordered' }, { list: 'bullet' }],
[{ header: [1, 2, 3, false] }],
[{ color: [] }, { background: [] }],
],
},
},
};
},
};
</script>
Особенности двустороннего связывания:
v-model автоматически синхронизирует содержимое редактора с
переменной content в data. Любые изменения в
редакторе обновляют content, и наоборот.
Редакторы предоставляют события для контроля пользовательских действий. В Quill:
@text-change — вызывается при изменении текста.@selection-change — вызывается при изменении
выделения.Пример:
<quill-editor
v-model="content"
@text-change="onTextChange"
/>
<script>
methods: {
onTextChange(delta, oldDelta, source) {
console.log('Изменение текста:', delta, source);
}
}
</script>
Для централизованного управления содержимым можно использовать Vuex:
computed: {
content: {
get() {
return this.$store.state.editorContent;
},
set(value) {
this.$store.commit('updateEditorContent', value);
},
},
},
Мутация в Vuex:
mutations: {
updateEditorContent(state, payload) {
state.editorContent = payload;
},
},
Редакторы позволяют добавлять собственные кнопки и панели
инструментов. В Quill это делается через модуль
toolbar:
editorOptions: {
modules: {
toolbar: {
container: [
['bold', 'italic'],
['link', 'image', 'video'],
[{ header: 1 }, { header: 2 }],
],
handlers: {
image: function() {
const input = document.createElement('input');
input.setAttribute('type', 'file');
input.click();
input.oncha nge = () => {
const file = input.files[0];
// Логика загрузки изображения на сервер
};
},
},
},
},
}
Для загрузки медиафайлов обычно используется обработка событий
change или кастомные плагины. Важно обеспечить:
Rich Text редакторы возвращают HTML-код. Для безопасного отображения
контента во Vue используется директива v-html:
<div v-html="content"></div>
Рекомендуется предварительно очищать HTML через библиотеки вроде
DOMPurify, чтобы предотвратить XSS-атаки.
С использованием Composition API можно создать реактивный редактор:
import { ref } from 'vue';
export default {
setup() {
const content = ref('');
const editorOptions = {
theme: 'snow',
placeholder: 'Введите текст...',
};
const onTextCha nge = (delta, oldDelta, source) => {
console.log('Текст изменен:', delta);
};
return { content, editorOptions, onTextChange };
},
};
Для сложных приложений часто создают компоненты обёртки, поддерживающие несколько редакторов на странице с индивидуальными настройками. Это позволяет:
defineAsyncComponent.