当前位置:首页 > 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 的现代编辑器:

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>

实现秀米特色功能

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

<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页面分离的实现方法 将Vue页面分离为多个组件或模块,有助于提升代码可维护性和复用性。以下是几种常见的实现方式: 组件化拆分 通过将页面拆分为多个子组件,每个组件负责特定功能或UI部分。使用…

vue实现访问量

vue实现访问量

Vue 实现访问量统计的方法 使用前端计数 在 Vue 中可以通过简单的计数器实现页面访问量的统计。这种方法适合小型项目或演示用途。 // 在 Vue 组件中 data() { return {…

vue怎么实现数据检测

vue怎么实现数据检测

Vue 数据检测的实现方式 Vue 通过响应式系统实现数据检测,核心机制基于 Object.defineProperty(Vue 2)或 Proxy(Vue 3)。以下是具体实现方法: 基于 Vue…

vue实现全局遮罩层

vue实现全局遮罩层

实现全局遮罩层的方法 在Vue中实现全局遮罩层可以通过多种方式完成,以下是几种常见的实现方法: 使用Vue组件创建遮罩层 创建一个遮罩层组件,通过全局注册或动态挂载的方式实现全局调用。以下是一个简单…

vue手写签名如何实现

vue手写签名如何实现

实现手写签名的基本思路 在Vue中实现手写签名功能,通常需要借助HTML5的Canvas API来捕获用户的绘制操作。核心流程包括初始化画布、监听触摸/鼠标事件、记录轨迹以及生成签名图片。 安装依…

vue实现飘窗原理

vue实现飘窗原理

vue实现飘窗原理 飘窗效果通常指在页面上悬浮显示的弹窗或通知,跟随页面滚动或固定在某个位置。Vue实现这一效果主要依赖组件化开发、CSS定位和动态数据绑定。 组件结构设计 创建一个独立的Vue组件…