当前位置:首页 > VUE

vue实现markdown

2026-03-27 12:28:43VUE

Vue 实现 Markdown 编辑器/渲染器

在 Vue 中实现 Markdown 功能通常需要结合第三方库或自定义解析器。以下是几种常见方法:

使用 marked.js 库

marked.js 是一个轻量级的 Markdown 解析器,可以快速将 Markdown 转换为 HTML。

安装依赖:

npm install marked

在 Vue 组件中使用:

<template>
  <div>
    <textarea v-model="markdown" @input="updateHtml"></textarea>
    <div v-html="html"></div>
  </div>
</template>

<script>
import { marked } from 'marked';

export default {
  data() {
    return {
      markdown: '# Hello World',
      html: ''
    };
  },
  mounted() {
    this.updateHtml();
  },
  methods: {
    updateHtml() {
      this.html = marked(this.markdown);
    }
  }
};
</script>

使用 vue-markdown 组件

vue-markdown 是一个专门为 Vue 设计的 Markdown 组件。

安装:

npm install vue-markdown

使用示例:

<template>
  <vue-markdown :source="markdownText" />
</template>

<script>
import VueMarkdown from 'vue-markdown';

export default {
  components: {
    VueMarkdown
  },
  data() {
    return {
      markdownText: '# Vue Markdown Component\n\nThis is bold text.'
    };
  }
};
</script>

使用 highlight.js 添加代码高亮

结合 marked.js 和 highlight.js 可以实现代码语法高亮。

安装依赖:

npm install marked highlight.js

配置示例:

import { marked } from 'marked';
import hljs from 'highlight.js';

marked.setOptions({
  highlight: function(code, lang) {
    if (lang && hljs.getLanguage(lang)) {
      return hljs.highlight(lang, code).value;
    }
    return hljs.highlightAuto(code).value;
  }
});

自定义 Markdown 解析器

对于简单需求,可以创建自定义解析器:

const simpleMarkdown = (text) => {
  return text
    .replace(/^# (.*$)/gm, '<h1>$1</h1>')
    .replace(/^## (.*$)/gm, '<h2>$1</h2>')
    .replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>')
    .replace(/\*(.*?)\*/g, '<em>$1</em>');
};

注意事项

  1. 使用 v-html 时要注意 XSS 安全问题,确保内容可信或进行过滤
  2. 对于复杂 Markdown 需求,推荐使用专业库如 marked.js 或 remark
  3. 编辑器功能可以考虑使用 CodeMirror 或 Monaco Editor 集成
  4. 性能优化:对于大量 Markdown 内容,考虑使用虚拟滚动

完整编辑器示例

结合 marked.js 和 CodeMirror 创建完整编辑器:

vue实现markdown

<template>
  <div class="editor-container">
    <textarea ref="editor"></textarea>
    <div class="preview" v-html="compiledMarkdown"></div>
  </div>
</template>

<script>
import { marked } from 'marked';
import CodeMirror from 'codemirror';
import 'codemirror/mode/markdown/markdown';
import 'codemirror/lib/codemirror.css';

export default {
  data() {
    return {
      markdownContent: '# Markdown Editor\n\nType here...',
      compiledMarkdown: ''
    };
  },
  mounted() {
    this.editor = CodeMirror.fromTextArea(this.$refs.editor, {
      mode: 'markdown',
      lineNumbers: true,
      value: this.markdownContent
    });

    this.editor.on('change', (cm) => {
      this.markdownContent = cm.getValue();
      this.compiledMarkdown = marked(this.markdownContent);
    });

    this.compiledMarkdown = marked(this.markdownContent);
  }
};
</script>

<style>
.editor-container {
  display: flex;
  height: 100vh;
}
.preview {
  flex: 1;
  padding: 20px;
  overflow-y: auto;
}
.CodeMirror {
  flex: 1;
  height: 100%;
}
</style>

标签: vuemarkdown
分享给朋友:

相关文章

vue实现triger

vue实现triger

在Vue中实现触发器(trigger)功能通常涉及自定义事件或DOM事件触发。以下是几种常见场景的实现方法: 自定义事件触发 通过$emit方法触发父组件中监听的自定义事件: // 子组件 thi…

vue 实现级联

vue 实现级联

Vue 实现级联选择器 级联选择器(Cascader)常用于省市区选择、分类选择等场景。Vue 中可以通过 Element UI、Ant Design Vue 等 UI 库实现,也可以手动封装。 使…

vue router 实现

vue router 实现

Vue Router 的实现 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是 Vue Router 的核心实现方式。 安装 Vue Router 通过…

vue实现input

vue实现input

Vue 实现 Input 输入框的方法 基本双向绑定 使用 v-model 指令实现双向数据绑定,适用于大多数表单场景: <template> <input v-model="…

vue滑块实现

vue滑块实现

Vue滑块实现方法 使用原生HTML5 range input Vue中可以绑定原生HTML5的range类型input元素实现基础滑块功能: <template> <div&…

vue实现音乐

vue实现音乐

Vue实现音乐播放功能 使用Vue实现音乐播放功能可以通过多种方式完成,以下是几种常见的实现方法: 使用HTML5 Audio API 在Vue组件中直接使用HTML5的Audio对象来控制音乐播放…