当前位置:首页 > VUE

vue实现md编辑

2026-01-19 14:44:12VUE

vue实现markdown编辑器

使用Vue实现Markdown编辑器可以借助现成的库或组件,以下是几种常见实现方式:

使用marked和highlight.js库

安装依赖库:

npm install marked highlight.js

创建Vue组件:

<template>
  <div class="markdown-editor">
    <textarea v-model="markdown"></textarea>
    <div v-html="compiledMarkdown" class="markdown-preview"></div>
  </div>
</template>

<script>
import marked from 'marked';
import hljs from 'highlight.js';

marked.setOptions({
  highlight: function(code, lang) {
    return hljs.highlightAuto(code, [lang]).value;
  }
});

export default {
  data() {
    return {
      markdown: '# Hello World'
    }
  },
  computed: {
    compiledMarkdown() {
      return marked(this.markdown);
    }
  }
}
</script>

<style>
.markdown-editor {
  display: flex;
}
textarea {
  width: 50%;
  min-height: 500px;
}
.markdown-preview {
  width: 50%;
  padding: 10px;
  border: 1px solid #ddd;
}
</style>

使用vue-markdown组件

安装vue-markdown:

vue实现md编辑

npm install vue-markdown

基本用法:

<template>
  <div>
    <textarea v-model="content"></textarea>
    <vue-markdown :source="content"></vue-markdown>
  </div>
</template>

<script>
import VueMarkdown from 'vue-markdown'

export default {
  components: {
    VueMarkdown
  },
  data() {
    return {
      content: '# Markdown Content'
    }
  }
}
</script>

使用mavon-editor

mavon-editor是一个功能丰富的Markdown编辑器:

vue实现md编辑

npm install mavon-editor

实现代码:

<template>
  <mavon-editor v-model="content"/>
</template>

<script>
import { mavonEditor } from 'mavon-editor'
import 'mavon-editor/dist/css/index.css'

export default {
  components: {
    mavonEditor
  },
  data() {
    return {
      content: ''
    }
  }
}
</script>

实现双向绑定实时预览

对于自定义实现,可以结合watch或computed属性实现实时预览:

<template>
  <div class="editor-container">
    <div class="editor-column">
      <textarea v-model="rawText"></textarea>
    </div>
    <div class="preview-column" v-html="compiledHtml"></div>
  </div>
</template>

<script>
import marked from 'marked';

export default {
  data() {
    return {
      rawText: ''
    }
  },
  computed: {
    compiledHtml() {
      return marked(this.rawText);
    }
  }
}
</script>

<style>
.editor-container {
  display: flex;
}
.editor-column, .preview-column {
  flex: 1;
  padding: 10px;
}
textarea {
  width: 100%;
  height: 500px;
}
</style>

添加扩展功能

支持代码高亮

import hljs from 'highlight.js';
import 'highlight.js/styles/github.css';

marked.setOptions({
  highlight: function(code, language) {
    const validLanguage = hljs.getLanguage(language) ? language : 'plaintext';
    return hljs.highlight(validLanguage, code).value;
  }
});

添加工具栏

<template>
  <div>
    <div class="toolbar">
      <button @click="insertText('bold')">Bold</button>
      <button @click="insertText('*italic*')">Italic</button>
    </div>
    <textarea ref="editor" v-model="content"></textarea>
  </div>
</template>

<script>
export default {
  methods: {
    insertText(text) {
      const textarea = this.$refs.editor;
      const start = textarea.selectionStart;
      const end = textarea.selectionEnd;
      this.content = this.content.substring(0, start) + 
                    text + 
                    this.content.substring(end);
      this.$nextTick(() => {
        textarea.setSelectionRange(start + text.length, start + text.length);
        textarea.focus();
      });
    }
  }
}
</script>

注意事项

  • 使用v-html时要注意XSS攻击风险,确保内容可信或进行适当过滤
  • 大型项目推荐使用专门的Markdown编辑器组件如mavon-editor
  • 考虑添加撤销/重做功能时需要维护编辑历史状态
  • 移动端适配可能需要特殊处理文本区域大小和工具栏布局

以上方案可根据项目需求选择或组合使用,mavon-editor提供了开箱即用的完整解决方案,而自定义实现则提供更大灵活性。

标签: 编辑vue
分享给朋友:

相关文章

vue实现冰墩墩

vue实现冰墩墩

使用 Vue 实现冰墩墩动画 通过 Vue 的动画特性和 SVG 技术,可以动态渲染冰墩墩的形象。以下是具体实现方法: 准备 SVG 素材 冰墩墩的形象通常由多个 SVG 路径组成,包括身体轮廓…

vue实现展开与收起

vue实现展开与收起

Vue 实现展开与收起功能 在 Vue 中实现展开与收起功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-show 或 v-if 控制显示 通过 Vue 的指令 v-show 或 v-i…

vue实现3d宇宙

vue实现3d宇宙

Vue实现3D宇宙效果 使用Three.js库 Three.js是一个强大的JavaScript 3D库,可以轻松集成到Vue项目中。安装Three.js依赖: npm install three…

vue实现下拉框删除

vue实现下拉框删除

Vue 实现下拉框删除功能 在Vue中实现下拉框的删除功能通常涉及以下步骤: 数据绑定与渲染 在Vue组件中定义数据数组用于存储下拉框选项: data() { return { op…

vue实现边框

vue实现边框

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

vue   实现单选

vue 实现单选

Vue 实现单选功能 在 Vue 中实现单选功能可以通过多种方式,以下是几种常见的方法: 使用原生 <input type="radio"> 绑定 v-model 通过 v-model…