当前位置: 首页 > news >正文

vue3工程中使用vditor完成markdown渲染并防止xss攻击

vue3工程中使用vditor完成markdown渲染并防止xss攻击

  • 背景
  • 环境
  • 解决方案
    • 引入依赖
  • 组件封装
  • 实现效果

背景

做oj系统时,题目使用的时markdown语法字符串,前端查看时需要将markdown转html再渲染到页面上。

环境

  • vite
  • vue3
  • pnpm

解决方案

引入依赖

pnpm install vditor dompurify
  • vditor用于完成markdown转html
  • dompurify用于去除恶意代码

组件封装

<script setup lang="ts">
import Vditor from 'vditor'
import 'vditor/dist/index.css'
import { onMounted, ref, watch } from 'vue'
import DOMPurify from 'dompurify'

const contentEditor = ref()
const previewContent = ref('')

// 注册事件
const emit = defineEmits(['update:modelValue'])

// 父组件传来的值
const props = defineProps({
  modelValue: {
    type: String,
    default: '',
  },
})

onMounted(() => {
  contentEditor.value = new Vditor('mdEdit', {
    height: 360,
    width: '100%',
    toolbarConfig: {
      pin: true,
    },
    value: props.modelValue,
    mode: 'sv', // 使用分屏预览模式
    toolbar: [
      'emoji',
      'headings',
      'bold',
      'italic',
      'strike',
      '|',
      'line',
      'quote',
      'list',
      'ordered-list',
      'check',
      'outdent',
      'indent',
      'code',
      'inline-code',
      'insert-after',
      'insert-before',
      'undo',
      'redo',
      'link',
      'table',
      'fullscreen',
      'outline',
    ],
    cache: {
      enable: false,
    },
    // 失去焦点时触发
    blur(value: string) {
      // 触发事件,给父组件传值
      emit('update:modelValue', value)
    },
    after() {
      getSafeHtml()
    },
  })
})

// 定义用于获取安全html的函数
function getSafeHtml() {
  previewContent.value = DOMPurify.sanitize(contentEditor.value.getHTML())
}

// 监视modelValue实现双向数据绑定
watch(
  () => props.modelValue,
  (newValue) => {
    contentEditor.value.setValue(newValue)
    getSafeHtml()
  },
)
</script>

<template>
  <div>
    <div id="mdEdit" v-show="false" />
    <div v-html="previewContent" class="preview"></div>
  </div>
</template>

<style scoped>
.preview {
  margin-top: 20px;
  padding: 10px;
  border: 1px solid #ccc;
  border-radius: 5px;
  background-color: #f9f9f9;
}
</style>

实现效果

在这里插入图片描述

相关文章:

  • 网络相关题目
  • 996引擎-疑难杂症:Ctrl + F9 编辑好的UI进入游戏查看却是歪的
  • Git vs SVN 核心区别
  • 《从零搭建Vue3项目实战》(AI辅助搭建Vue3+ElemntPlus后台管理项目)零基础入门系列第一篇:开发环境准备
  • DeepSeek底层揭秘——《推理时Scaling方法》内容理解
  • notepad++日常使用(每行开头、每行末尾增加字符串,每行中间去掉字符串)
  • 接口自动化测试总结
  • EN 60601-1-2(医疗电气设备电磁兼容性要求)及相关EMC标准的全面解读
  • 13_Hugging Face 核心组件介绍
  • Docker 数据挂载教程
  • SQL语言的物联网数据分析
  • 多语言电商系统:外贸货源共享系统的本土化实践
  • java后端对时间进行格式处理
  • Codeforces Round 1000 (Div. 2)
  • 激光干涉仪学习
  • mac 卸载流氓软件安全助手
  • TypeScript 中的 infer 关键字用途
  • C++11QT复习 (十六)
  • C++继承完全指南:从语法到设计模式----图解原理+工业级代码示例+陷阱规避
  • mnggiflab-gif压缩功能更新
  • 哪个装修公司比较好/旅游企业seo官网分析报告
  • 虚拟主机管理系统源码/福州百度关键词优化
  • 网站外链平台/平台运营
  • 电子商务seo实训总结/seo日常工作
  • 移动商城网站开发/磁力狗
  • 新建网站怎么想谷歌和百度提交/莱阳seo排名