当前位置:首页 > VUE

vue实现秀米

2026-01-18 02:13:27VUE

Vue 实现类似秀米的富文本编辑器

使用 Vue 实现类似秀米的富文本编辑器需要结合富文本编辑库和自定义组件。以下是实现方案:

方案一:基于 Quill 的扩展 安装 Quill 和相关插件:

npm install quill vue-quill-editor

创建自定义编辑器组件:

<template>
  <div class="editor-container">
    <quill-editor
      v-model="content"
      :options="editorOptions"
      @change="onEditorChange"
    />
    <div class="toolbar">
      <button @click="insertTemplate('header')">插入标题</button>
      <button @click="insertTemplate('image')">插入图片</button>
    </div>
  </div>
</template>

<script>
import { quillEditor } from 'vue-quill-editor'

export default {
  components: { quillEditor },
  data() {
    return {
      content: '',
      editorOptions: {
        modules: {
          toolbar: [
            ['bold', 'italic', 'underline'],
            ['image', 'video']
          ]
        }
      }
    }
  },
  methods: {
    onEditorChange({ html }) {
      console.log(html)
    },
    insertTemplate(type) {
      if(type === 'header') {
        this.content += '<h1>标题文字</h1>'
      }
    }
  }
}
</script>

方案二:使用 Tiptap 编辑器 Tiptap 是基于 ProseMirror 的现代编辑器:

vue实现秀米

npm install @tiptap/vue-2 @tiptap/starter-kit

实现组件:

<template>
  <editor-content :editor="editor" />
</template>

<script>
import { Editor, EditorContent } from '@tiptap/vue-2'
import StarterKit from '@tiptap/starter-kit'

export default {
  components: { EditorContent },
  data() {
    return {
      editor: null
    }
  },
  mounted() {
    this.editor = new Editor({
      content: '<p>初始内容</p>',
      extensions: [
        StarterKit
      ],
      onUpdate: ({ editor }) => {
        console.log(editor.getHTML())
      }
    })
  }
}
</script>

实现秀米特色功能

模板系统 创建可复用的模板组件:

vue实现秀米

<template>
  <div class="template-gallery">
    <div 
      v-for="(temp, index) in templates"
      :key="index"
      @click="applyTemplate(temp)"
    >
      <img :src="temp.preview">
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      templates: [
        { id: 1, preview: 'header.png', html: '<div class="xiumi-header">...</div>' }
      ]
    }
  },
  methods: {
    applyTemplate(template) {
      this.$emit('insert', template.html)
    }
  }
}
</script>

样式隔离 使用 Scoped CSS 和 BEM 命名规范:

/* 编辑器样式 */
.editor-container >>> .ql-container {
  font-family: 'PingFang SC';
}

/* 模板样式 */
.xiumi-template {
  margin: 10px 0;
  border: 1px dashed #eee;
}

与后端数据交互

实现内容保存和加载:

// API 方法
export default {
  methods: {
    async saveContent() {
      await axios.post('/api/content', { html: this.content })
    },
    async loadContent(id) {
      const res = await axios.get(`/api/content/${id}`)
      this.content = res.data.html
    }
  }
}

移动端适配

添加响应式处理:

// 检测设备类型
const isMobile = window.innerWidth < 768

// 动态调整工具栏
editorOptions: {
  toolbar: isMobile ? 
    [['bold', 'italic']] : 
    fullToolbarOptions
}

以上方案提供了在 Vue 中实现类似秀米编辑器的基本框架,可根据实际需求扩展更多功能如素材库、多列布局等。核心在于结合现有富文本编辑器进行二次开发,通过组件化方式实现模板系统。

标签: vue
分享给朋友:

相关文章

vue实现边框

vue实现边框

Vue 实现边框的方法 在 Vue 中实现边框效果可以通过多种方式完成,包括内联样式、CSS 类绑定、动态样式以及使用第三方 UI 库。以下是几种常见的实现方法。 内联样式绑定 使用 Vue 的 :…

vue实现动态

vue实现动态

Vue 实现动态路由的方法 在 Vue 中实现动态路由通常涉及以下几个关键步骤: 使用 Vue Router 的动态路由匹配 通过 Vue Router 的 :param 语法可以实现动态路由匹配。…

vue实现节流

vue实现节流

vue实现节流的方法 在Vue中实现节流(throttle)功能,通常用于限制高频事件的触发频率,例如滚动、输入或按钮点击。以下是几种常见的实现方式: 使用Lodash的throttle函数 安装L…

vue实现ios

vue实现ios

Vue 实现 iOS 风格应用 使用 Vue 实现 iOS 风格的应用,可以通过结合 UI 框架和自定义样式来达成目标。以下是具体方法和步骤: 选择 iOS 风格的 UI 框架 Vue 生态中有多…

vue 实现排序

vue 实现排序

Vue 实现排序的方法 使用计算属性实现排序 通过计算属性对数组进行排序,可以保持原始数据不变。示例代码展示了如何对列表按名称升序排序: <template> <div>…

vue实现抽奖

vue实现抽奖

Vue 实现抽奖功能 基本抽奖逻辑 创建一个Vue组件,包含奖品列表、抽奖按钮和结果显示区域。使用随机数生成器选择奖品。 <template> <div> <…