当前位置:首页 > VUE

vue实现富文本

2026-01-18 17:21:22VUE

Vue 实现富文本编辑器的方法

使用现成的富文本编辑器库

Vue 生态中有多个成熟的富文本编辑器库可供选择,以下是几个常用的选项:

  1. Quill

    • 安装依赖:

      npm install quill @vueup/vue-quill
    • 基本用法:

      <template>
        <QuillEditor v-model:content="content" contentType="html" />
      </template>
      
      <script>
      import { QuillEditor } from '@vueup/vue-quill'
      import '@vueup/vue-quill/dist/vue-quill.snow.css'
      
      export default {
        components: { QuillEditor },
        data() {
          return {
            content: '<h1>Hello World!</h1>'
          }
        }
      }
      </script>
  2. TinyMCE

    • 安装依赖:

      npm install @tinymce/tinymce-vue
    • 需要注册 TinyMCE 账号获取 API key

    • 基本用法:

      <template>
        <Editor
          api-key="your-api-key"
          v-model="content"
          :init="{
            height: 500,
            plugins: 'lists link image table code help wordcount'
          }"
        />
      </template>
      
      <script>
      import Editor from '@tinymce/tinymce-vue'
      
      export default {
        components: { Editor },
        data() {
          return {
            content: 'Welcome to TinyMCE!'
          }
        }
      }
      </script>
  3. CKEditor

    • 安装依赖:

      npm install @ckeditor/ckeditor5-vue @ckeditor/ckeditor5-build-classic
    • 基本用法:

      <template>
        <CKEditor :editor="editor" v-model="content" />
      </template>
      
      <script>
      import CKEditor from '@ckeditor/ckeditor5-vue'
      import ClassicEditor from '@ckeditor/ckeditor5-build-classic'
      
      export default {
        components: { CKEditor: CKEditor.component },
        data() {
          return {
            editor: ClassicEditor,
            content: '<p>CKEditor content</p>'
          }
        }
      }
      </script>

自定义实现简单富文本

如果需要轻量级的解决方案,可以使用浏览器原生的 contenteditable 属性:

<template>
  <div
    contenteditable
    @input="handleInput"
    v-html="content"
    class="rich-text-editor"
  ></div>
</template>

<script>
export default {
  props: ['modelValue'],
  emits: ['update:modelValue'],
  computed: {
    content: {
      get() {
        return this.modelValue
      },
      set(value) {
        this.$emit('update:modelValue', value)
      }
    }
  },
  methods: {
    handleInput(e) {
      this.content = e.target.innerHTML
    }
  }
}
</script>

<style>
.rich-text-editor {
  min-height: 200px;
  border: 1px solid #ccc;
  padding: 10px;
}
</style>

实现工具栏功能

对于自定义编辑器,可以添加工具栏来控制文本样式:

<template>
  <div class="editor-container">
    <div class="toolbar">
      <button @click="formatText('bold')">B</button>
      <button @click="formatText('italic')">I</button>
      <button @click="formatText('underline')">U</button>
      <select v-model="heading" @change="formatHeading">
        <option value="">Normal</option>
        <option value="h1">Heading 1</option>
        <option value="h2">Heading 2</option>
      </select>
    </div>
    <div
      ref="editor"
      contenteditable
      @input="updateContent"
      class="editor-content"
    ></div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      heading: '',
      content: ''
    }
  },
  methods: {
    formatText(command) {
      document.execCommand(command, false, null)
      this.$refs.editor.focus()
    },
    formatHeading() {
      document.execCommand('formatBlock', false, this.heading || 'p')
      this.$refs.editor.focus()
    },
    updateContent() {
      this.content = this.$refs.editor.innerHTML
    }
  }
}
</script>

注意事项

  1. XSS 防护:富文本内容可能包含恶意代码,在显示用户输入内容时务必进行过滤。可以使用 DOMPurify 等库:

    npm install dompurify

    使用示例:

    import DOMPurify from 'dompurify'
    const cleanHtml = DOMPurify.sanitize(dirtyHtml)
  2. 图片上传:大多数富文本编辑器需要配置图片上传功能,通常需要后端接口支持。

  3. 移动端兼容性:不同编辑器在移动设备上的表现可能不一致,需要进行充分测试。

  4. 性能考虑:复杂的富文本编辑器可能影响页面性能,特别是在处理大量内容时。

vue实现富文本

标签: 文本vue
分享给朋友:

相关文章

前端vue登录功能实现

前端vue登录功能实现

Vue 登录功能实现步骤 创建登录表单组件 在 Vue 项目中创建一个登录组件,通常命名为 Login.vue。该组件包含用户名和密码输入框以及提交按钮。 <template> &…

vue实现列表显示

vue实现列表显示

Vue 实现列表显示的方法 在 Vue 中实现列表显示通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式。 基本列表渲染 通过 v-for 指令遍历数组,动态生成…

vue按钮实现截屏

vue按钮实现截屏

Vue 按钮实现截屏的方法 在 Vue 项目中实现截屏功能可以通过多种方式完成,以下是几种常见的方法: 使用 html2canvas 库 安装 html2canvas 库: npm insta…

vue无限菜单怎么实现

vue无限菜单怎么实现

实现 Vue 无限菜单的方法 递归组件实现嵌套菜单 使用 Vue 的递归组件特性可以轻松实现无限级嵌套菜单。通过组件调用自身的方式处理嵌套数据。 <template> <ul&…

vue实现一个标签选择

vue实现一个标签选择

Vue 标签选择组件实现 基础实现 使用 Vue 的 v-for 和 v-model 指令可以快速实现标签选择功能: <template> <div class="tag-se…

vue全选实现

vue全选实现

Vue 全选实现方法 在 Vue 中实现全选功能通常涉及数据绑定和事件处理。以下是几种常见的实现方式: 基础实现方式 <template> <div> <…