当前位置: 首页 > 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>

实现效果

在这里插入图片描述

http://www.dtcms.com/a/117629.html

相关文章:

  • 网络相关题目
  • 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压缩功能更新
  • C++学习之本地套接字libevent
  • C++ :特殊类设计
  • 空值处理操作符
  • 如何深刻理解Reactor和Proactor
  • MySQL学习笔记四
  • 城电科技 | 太阳能花怎么选择?光伏太阳花的应用场景在哪里?
  • 用 HTML、CSS 和 jQuery 打造多页输入框验证功能
  • ES:geoip_databases
  • AWS SNS深度解析:构建高可用、可扩展的云原生消息通信解决方案
  • 基于Java的人脸识别在线考试系统(jsp+springboot+mysql8.x)