当前位置:首页 > VUE

vue如何实现富文本

2026-01-20 13:57:11VUE

使用 vue-quill-editor 实现富文本

安装 vue-quill-editor 依赖

npm install vue-quill-editor --save

在组件中引入并使用

import { quillEditor } from 'vue-quill-editor'
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'

export default {
  components: {
    quillEditor
  },
  data() {
    return {
      content: ''
    }
  }
}

模板中使用

<quill-editor v-model="content" :options="editorOption"></quill-editor>

配置编辑器选项

editorOption: {
  placeholder: '请输入内容',
  modules: {
    toolbar: [
      ['bold', 'italic', 'underline', 'strike'],
      ['blockquote', 'code-block'],
      [{ 'header': 1 }, { 'header': 2 }],
      [{ 'list': 'ordered'}, { 'list': 'bullet' }],
      [{ 'script': 'sub'}, { 'script': 'super' }],
      [{ 'indent': '-1'}, { 'indent': '+1' }],
      [{ 'direction': 'rtl' }],
      [{ 'size': ['small', false, 'large', 'huge'] }],
      [{ 'header': [1, 2, 3, 4, 5, 6, false] }],
      [{ 'color': [] }, { 'background': [] }],
      [{ 'font': [] }],
      [{ 'align': [] }],
      ['clean'],
      ['link', 'image', 'video']
    ]
  }
}

使用 tinymce-vue 实现富文本

安装 tinymce-vue 和 tinymce

npm install @tinymce/tinymce-vue tinymce --save

在组件中引入

import Editor from '@tinymce/tinymce-vue'

模板中使用

<editor
  v-model="content"
  :init="initOptions"
/>

配置初始化选项

initOptions: {
  height: 500,
  language_url: '/static/tinymce/langs/zh_CN.js',
  language: 'zh_CN',
  plugins: 'print preview searchreplace autolink directionality visualblocks visualchars fullscreen image link media template code codesample table charmap hr pagebreak nonbreaking anchor insertdatetime advlist lists wordcount imagetools textpattern help emoticons autosave',
  toolbar: 'code undo redo restoredraft | cut copy paste pastetext | forecolor backcolor bold italic underline strikethrough link anchor | alignleft aligncenter alignright alignjustify outdent indent | \
    styleselect formatselect fontselect fontsizeselect | bullist numlist | blockquote subscript superscript removeformat | \
    table image media charmap emoticons hr pagebreak insertdatetime print preview | fullscreen | bdmap indent2em lineheight formatpainter axupimgs',
  images_upload_handler: function (blobInfo, success, failure) {
    // 图片上传处理
  }
}

自定义富文本编辑器实现

创建基础编辑器组件

<div contenteditable="true" ref="editor" @input="updateContent"></div>

处理内容更新

updateContent() {
  this.content = this.$refs.editor.innerHTML
}

添加基本工具栏功能

<div class="toolbar">
  <button @click="formatText('bold')">加粗</button>
  <button @click="formatText('italic')">斜体</button>
  <button @click="insertImage">插入图片</button>
</div>

实现文本格式化方法

formatText(command, value = null) {
  document.execCommand(command, false, value)
  this.$refs.editor.focus()
}

实现图片插入功能

insertImage() {
  const url = prompt('输入图片URL')
  if (url) {
    document.execCommand('insertImage', false, url)
  }
}

富文本内容的安全处理

安装 DOMPurify 进行内容净化

npm install dompurify --save

在提交前净化内容

import DOMPurify from 'dompurify'

methods: {
  submitContent() {
    const cleanContent = DOMPurify.sanitize(this.content)
    // 提交净化后的内容
  }
}

设置白名单允许的标签和属性

const cleanContent = DOMPurify.sanitize(this.content, {
  ALLOWED_TAGS: ['p', 'b', 'i', 'u', 'img', 'br', 'a'],
  ALLOWED_ATTR: ['href', 'src', 'alt']
})

富文本内容存储与显示

存储内容到数据库

axios.post('/api/content', {
  content: this.content
})

显示富文本内容

<div v-html="content"></div>

添加样式确保显示一致

.ql-editor {
  min-height: 200px;
}
.ql-container {
  font-family: inherit;
}

vue如何实现富文本

分享给朋友:

相关文章

vue如何实现

vue如何实现

Vue 实现方法 在 Vue 中实现功能通常涉及组件化开发、状态管理和响应式数据绑定。以下是几种常见的实现方式: 组件化开发 使用 Vue 的单文件组件(.vue 文件)结构,将 UI 拆分为可复用…

vue如何实现拖动

vue如何实现拖动

Vue 实现拖动的几种方法 使用 HTML5 原生拖放 API HTML5 提供了原生的拖放 API,通过 draggable 属性和相关事件实现拖动功能。 <template> &…

vue如何实现滚动

vue如何实现滚动

Vue 实现滚动的方法 使用原生 JavaScript 方法 在 Vue 中可以通过 window.scrollTo 或 Element.scrollIntoView 实现滚动。例如,滚动到页面顶部:…

vue如何实现分离

vue如何实现分离

Vue 实现组件分离的方法 Vue 可以通过多种方式实现组件分离,提升代码的可维护性和复用性。以下是几种常见的方法: 单文件组件 (SFC) Vue 的单文件组件(.vue 文件)将模板、脚本和样…

vue如何实现冒泡

vue如何实现冒泡

Vue 实现冒泡排序的步骤 在 Vue 中实现冒泡排序,可以通过数据绑定和计算属性来动态展示排序过程。以下是一个完整的实现示例。 示例代码 <template> <div>…

vue如何实现目录组件

vue如何实现目录组件

实现目录组件的基本思路 在Vue中实现目录组件通常需要结合页面内容的结构化数据(如标题层级),通过动态渲染生成可交互的目录。核心步骤包括提取标题、生成目录结构、实现滚动联动等。 提取标题信息 通过…