Vditor集成于VUE笔记

文章目录

  • 前言
  • 一、安装Vditor
  • 二、渲染markdown
  • 三、options
    • 3.1 自建CDN
    • 3.2 outline大纲不显示、不跳转问题
    • 3.3 upload 图片/视频上传
    • 3.4 toolbar
      • 提示位置
      • 点击事件
      • more中文字
    • 3.5 sv分屏渲染模式隐藏编辑框
    • 3.6 after中的insertValue或者setValue

前言

Vditor是一款易于使用的 Markdown 编辑器,为适配不同的应用场景而生

笔者只是用了Vditor的编辑模式,对于仅查看的markdown,笔者直接把编辑框给隐藏掉了。

Vditor官网

一、安装Vditor

笔者使用Vue2,vditor使用 3.10.4 版本

npm install vditor --save

二、渲染markdown

<template>
  <div id="vditor"></div>
</template>

<script>
import Vditor from "vditor";
// 这里使用官方默认样式
import "vditor/dist/index.css";


  export default {
    name:'HelloWorld',
    mounted(){
      let that = this;
      let IOptions = {
        // cdn:"/vditor",
        rtl: false,
        cache: {
            enable: false,
        },
        classes: {
            preview: "",
        },
        comment: {
            enable: false,
        },
        counter: {
            enable: false,
            type: "markdown",
        },
        customRenders: [],
        debugger: false,
        fullscreen: {
            index: 90,
        },
        height: "auto",
        hint: {
            delay: 200,
            emoji: {
                "+1": "👍",
                "-1": "👎",
                "confused": "😕",
                "eyes": "👀️",
                "heart": "❤️",
                "rocket": "🚀️",
                "smile": "😄",
                "tada": "🎉️",
            },
            // emojiPath: `${Constants.CDN}/dist/images/emoji`,
            extend: [],
            parse: true,
        },
        icon: "ant",
        lang: "zh_CN",
        mode: "ir",
        outline: {
            enable: false,
            position: "left",
        },
        placeholder: "请输入内容",
        preview: {
            actions: ["desktop", "tablet", "mobile", "mp-wechat", "zhihu"],
            delay: 1000,
            // hljs: Constants.HLJS_OPTIONS,
            // markdown: Constants.MARKDOWN_OPTIONS,
            // math: Constants.MATH_OPTIONS,
            maxWidth: 800,
            mode: "both",
            // theme: Constants.THEME_OPTIONS,
            render: {
                media: {
                    enable: true,
                }
            }
        },
        link: {
            isOpen: true,
        },
        image: {
            isPreview: true,
        },
        resize: {
            enable: false,
            position: "bottom",
        },
        theme: "classic",
        toolbar: [
            "emoji",
            "headings",
            "bold",
            "italic",
            "strike",
            "link",
            "|",
            "list",
            "ordered-list",
            "check",
            "outdent",
            "indent",
            "|",
            "quote",
            "line",
            "code",
            "inline-code",
            "insert-before",
            "insert-after",
            "|",
            "upload",
            "record",
            "table",
            "|",
            "undo",
            "redo",
            "|",
            "fullscreen",
            "edit-mode",
            {
                name: "more",
                toolbar: [
                    "both",
                    "code-theme",
                    "content-theme",
                    "export",
                    "outline",
                    "preview",
                    "devtools",
                    "info",
                    "help",
                ],
            },
        ],
        toolbarConfig: {
            hide: false,
            pin: false,
        },
        typewriterMode: true,
        undoDelay: 800,
        // upload: {
        //     extraData: {},
        //     fieldName: "file[]",
        //     filename: (name: string) => name.replace(/\W/g, ""),
        //     linkToImgUrl: "",
        //     max: 10 * 1024 * 1024,
        //     multiple: true,
        //     url: "",
        //     withCredentials: false,
        // },
        value: "",
        width: "auto",
        after:()=>{
          that.vditor.insertValue("# 插入数据")
          //that.vditor.setValue("# 覆盖数据")

        }
     }
      this.vditor = new Vditor("vditor",IOptions)

   } ,
    data() {
      return {
        vditor:"",
      }
    },
    created(){
      
    },
    methods:{
    
    },
  };
</script>

完成后我们可以看到如下页面(如上配置使用的是默认CDN,网络问题会导致很久不出现。内网环境无法加载,需要自建CDN)

在这里插入图片描述

三、options

具体含义可以参考-options的部分

3.1 自建CDN

我们如果需要内网运行,或者认为官方网址较慢,可以自建CDN。

自建CDN分为使用下载的npm包中的dist文件和vditor编译源码后的dist文件。

我们下载的包里面可以看到如下内容:

在这里插入图片描述

我们需要配置options中的

let IOptions = {
        cdn:"http://网址/XXX",
        ...
        }

vditor会在渲染时发送 GET http://网址/XXX/dist 一系列请求。

可以使用如下方式搭建:

  • nginx处理

对于nginx的配置需要允许跨域,和将dist配置为alias静态资源

  • 后端返回

后端将dist放在资源路径下,接受该Get请求,然后读取本地路径后返回

  • 项目文件

直接获取项目本地vditor,这个网上有很多人这么做,但笔者没有成功

3.2 outline大纲不显示、不跳转问题

sv模式(分屏渲染模式)下时是无法渲染大纲的(似乎是因为编辑框没做同步渲染)。我们可以直接覆盖其样式让他展现。

<style scoped>
	  #vditor :deep(.vditor-outline){
	      display:block !important;
	  }    
</style>

如果遇到了大纲不跳转问题,可能因为vditor的滚动条不在我们渲染的容器上,比如是一个子节点,这个时候就无法让其滚动。

我们只需要设置高度,让他可以计算自己的长度即可。如:

<div id="vditor" style="height: 800px;"></div>

3.3 upload 图片/视频上传

如果什么都不想改,最简单的方式是让后端返回如下格式的返回值即可:

{
 "msg": "",
 "code": 0,
 "data": {
 "errFiles": ['filename', 'filename2'],
 "succMap": {
   "filename3": "filepath3",
   "filename3": "filepath3"
   }
 }
}

errFiles 是失败的文件名
succMap 是成功的文件map,文件名-请求路径。最后markdown文件使用请求路径去获取图片/视频。

其余参考文档中upload部分,按需写提供的方法接口即可。

如下:

        upload: {
        	extraData: {},
       		fieldName: "file[]",
        	filename: (name: string) => name.replace(/\W/g, ""),
        	linkToImgUrl: "",
        	max: 10 * 1024 * 1024,
        	multiple: true,
        	url: "",
        	withCredentials: false,
        	success(editor: HTMLPreElement, msg: string){
        	...
        	},
        },

3.4 toolbar

提示位置

如图,提示的位置始终向上弹出,如果有header就会很麻烦
在这里插入图片描述
我们可以如下配置:

 toolbar: [
            "emoji",
            "headings",
            "bold",
            "italic",
            "strike",
            "link",
            "|",
            {
              name:"list",
              tipPosition:"s"
            },
            "ordered-list",
            "check",
            ...
          ]

如图:
在这里插入图片描述

点击事件

同理,如果我们想要覆盖原按钮我们可以进行2.2.3中的操作,如果我们想要实现新的点击事件,我们可以按照官方案例:

toolbar: [
    {
      hotkey: '⇧⌘S',
      name: 'sponsor',
      tipPosition: 's',
      tip: '成为赞助者',
      className: 'right',
      icon: '<svg t="1589994565028" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2808" width="32" height="32"><path d="M506.6 423.6m-29.8 0a29.8 29.8 0 1 0 59.6 0 29.8 29.8 0 1 0-59.6 0Z" fill="#0F0F0F" p-id="2809"></path><path d="M717.8 114.5c-83.5 0-158.4 65.4-211.2 122-52.7-56.6-127.7-122-211.2-122-159.5 0-273.9 129.3-273.9 288.9C21.5 562.9 429.3 913 506.6 913s485.1-350.1 485.1-509.7c0.1-159.5-114.4-288.8-273.9-288.8z" fill="#FAFCFB" p-id="2810"></path><path d="M506.6 926c-22 0-61-20.1-116-59.6-51.5-37-109.9-86.4-164.6-139-65.4-63-217.5-220.6-217.5-324 0-81.4 28.6-157.1 80.6-213.1 53.2-57.2 126.4-88.8 206.3-88.8 40 0 81.8 14.1 124.2 41.9 28.1 18.4 56.6 42.8 86.9 74.2 30.3-31.5 58.9-55.8 86.9-74.2 42.5-27.8 84.3-41.9 124.2-41.9 79.9 0 153.2 31.5 206.3 88.8 52 56 80.6 131.7 80.6 213.1 0 103.4-152.1 261-217.5 324-54.6 52.6-113.1 102-164.6 139-54.8 39.5-93.8 59.6-115.8 59.6zM295.4 127.5c-72.6 0-139.1 28.6-187.3 80.4-47.5 51.2-73.7 120.6-73.7 195.4 0 64.8 78.3 178.9 209.6 305.3 53.8 51.8 111.2 100.3 161.7 136.6 56.1 40.4 88.9 54.8 100.9 54.8s44.7-14.4 100.9-54.8c50.5-36.3 108-84.9 161.7-136.6 131.2-126.4 209.6-240.5 209.6-305.3 0-74.9-26.2-144.2-73.7-195.4-48.2-51.9-114.7-80.4-187.3-80.4-61.8 0-127.8 38.5-201.7 117.9-2.5 2.6-5.9 4.1-9.5 4.1s-7.1-1.5-9.5-4.1C423.2 166 357.2 127.5 295.4 127.5z" fill="#141414" p-id="2811"></path><path d="M353.9 415.6m-33.8 0a33.8 33.8 0 1 0 67.6 0 33.8 33.8 0 1 0-67.6 0Z" fill="#0F0F0F" p-id="2812"></path><path d="M659.3 415.6m-33.8 0a33.8 33.8 0 1 0 67.6 0 33.8 33.8 0 1 0-67.6 0Z" fill="#0F0F0F" p-id="2813"></path><path d="M411.6 538.5c0 52.3 42.8 95 95 95 52.3 0 95-42.8 95-95v-31.7h-190v31.7z" fill="#5B5143" p-id="2814"></path><path d="M506.6 646.5c-59.6 0-108-48.5-108-108v-31.7c0-7.2 5.8-13 13-13h190.1c7.2 0 13 5.8 13 13v31.7c0 59.5-48.5 108-108.1 108z m-82-126.7v18.7c0 45.2 36.8 82 82 82s82-36.8 82-82v-18.7h-164z" fill="#141414" p-id="2815"></path><path d="M450.4 578.9a54.7 27.5 0 1 0 109.4 0 54.7 27.5 0 1 0-109.4 0Z" fill="#EA64F9" p-id="2816"></path><path d="M256 502.7a32.1 27.5 0 1 0 64.2 0 32.1 27.5 0 1 0-64.2 0Z" fill="#EFAFF9" p-id="2817"></path><path d="M703.3 502.7a32.1 27.5 0 1 0 64.2 0 32.1 27.5 0 1 0-64.2 0Z" fill="#EFAFF9" p-id="2818"></path></svg>',
      click () {alert('捐赠地址:https://ld246.com/sponsor')},
    }],

粘贴后如下:
在这里插入图片描述
⇧⌘ 打出来比较麻烦,建议直接复制粘贴。

more中文字

在这里插入图片描述
如果想不是图标,则直接替换icon即可

 {
                name: "more",
                toolbar: [
                    "both",
                    "code-theme",
                    "content-theme",
                    "export",
                    "outline",
                    "preview",
                    "devtools",
                    "info",
                    "help",
                    {
				      hotkey: '⇧⌘S',
				      name: 'sponsor',
				      tipPosition: 's',
				      tip: '成为赞助者',
				      className: 'right',
				      icon: '赞助',
				      click () {alert('捐赠地址:https://ld246.com/sponsor')},
				    },
                ],
            },

在这里插入图片描述

3.5 sv分屏渲染模式隐藏编辑框

通过隐藏编辑框,我们可以直接获取到渲染后的样式,就不用分别调用api去渲染。
我们只需要将 mode设为sv,然后不允许切换编辑模式即可。

 <style scoped>
	  #vditor :deep(.vditor-outline){
	      display:block !important;
	
	  }    
	  #vditor :deep(.vditor-sv){
	    display:none !important;
	  }
  </style>

在这里插入图片描述

3.6 after中的insertValue或者setValue

insertValue 和 setValue 目前是没有回调方法的

当笔者想要读取url中的一些元素来跳转大纲标题时,没办法等待markdown以及大纲渲染完毕后执行跳转到对应标题操作。

因此笔者使用setTimeout定时器来处理,等到获取到子元素后在内部删除该定时器即可。

如果有更好的方式烦请留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/629961.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3D Web轻量化引擎HOOPS Communicator如何处理DWG文件中的图纸?

在当今工程设计和建筑领域&#xff0c;数字化技术已经成为不可或缺的一部分。HOOPS Communicator作为一种强大的三维数据可视化工具&#xff0c;被广泛应用于处理各种CAD文件&#xff0c;其中包括AutoCAD的DWG格式。在这篇文章中&#xff0c;我们将探讨HOOPS Communicator是如何…

DRF 跨域问题

【一】说明 CORS&#xff08;跨来源资源共享&#xff0c;Cross-Origin Resource Sharing&#xff09;是一种浏览器技术的规范&#xff0c;旨在解决浏览器同源策略&#xff08;Same-Origin Policy&#xff09;的限制&#xff0c;使得Web服务可以从不同的网域&#xff08;源&…

org.springframework.jdbc.BadSqlGrammarException

Cause: java.sql.SQLSyntaxErrorException: Table ‘web.emp’ doesn’t exist 产生原因&#xff1a;web表找不到&#xff0c;所以可能数据库配置错误 spring.datasource.urljdbc:mysql://localhost:3306/web02 更改完成后运行成功

Web浏览器的兼容性测试需要考虑哪些测试点?

测试web网站兼容性时&#xff0c;可以使用各种测试用例来确保网站在不同浏览器中的良好兼容性。以下是一些常见的兼容性测试用例示例&#xff1a; 1. 页面加载测试&#xff1a; - 确保网站在不同浏览器中正常加载&#xff0c;没有加载错误。 - 检查页面加载时间&#xff0c;…

场景文本检测识别学习 day09(SSM、S4、Mamba、S6)

SSM&#xff08;State Space Model&#xff09; SSM是一个针对连续函数的模型&#xff0c;即输入是连续函数&#xff0c;输出也是连续函数。上图为状态方程和输出方程&#xff0c;其中h(t)是当前时刻的状态&#xff0c;x(t)是当前时刻的输入&#xff0c;h’(t)是下一个时刻的状…

应用TRIZ创新原理解决技术矛盾的步骤是什么样的?

如何在有限的时间和资源下&#xff0c;高效地解决技术矛盾&#xff0c;推动技术的进步和创新呢&#xff1f;答案就隐藏在TRIZ创新原理之中。 首先&#xff0c;我们需要了解什么是TRIZ创新原理。TRIZ&#xff0c;即发明问题解决理论&#xff0c;是一套系统的创新方法论&#xff…

程序验证之Dafny--证明霍尔逻辑的半自动化利器

一、What is Dafny?【来自官网介绍 Dafny 】 1)介绍 Dafny 是一种支持验证的编程语言&#xff0c;配备了一个静态程序验证器。 通过将复杂的自动推理与熟悉的编程习语和工具相结合&#xff0c;使开发者能够编写可证明正确的代码&#xff08;相对于 {P}&#xff33;{Q} 这种…

uniapp微信小程序通过萤石云接入海康摄像机

需求&#xff1a;在uniapp微信小程序上查看海康威视的摄像机监控视频和和操作摄像机拍摄方向 在萤石云接入海康摄像机设备&#xff0c;由于不同品牌设备在不同时间段接入方式可能不一致&#xff0c;具体接入方式查看官方文档或咨询官方客服。 海康摄像机官方客服热线&#xf…

web学习笔记(五十五)

目录 1. 配置代码片段的步骤 2. 条件判断 2.1 v-if、v-else、v-else-if 2.2 v-show 2.3 v-show和v-if的区别 1. 配置代码片段的步骤 在Visual Studio Code中我们可以将常用的代码配置成代码片段&#xff0c;这样就可以在页面上快速输入大段代码了。 &#xff08;1&#…

JavaScript-基本数据类型和变量

基本数据类型 JavaScript支持数字、字符串和布尔值3种基本数据类型 字符串型 字符串型是JavaScript用来表示文本的数据类型&#xff0c;字符串通常由单引号或双引号括起来&#xff0c;如果字符串存在特殊字符&#xff0c;可以用转义字符代替 数字型 数字型也是JavaScript中的基…

pytest教程-46-钩子函数-pytest_sessionstart

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_report_testitemFinished钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_sessionstart钩子函数的使用方法。 pytest_sessionstart 是 Pytest 提供的一个钩子函数&#xff0c…

U盘中毒文件变乱码?揭秘原因与高效恢复方法!

在日常使用U盘的过程中&#xff0c;有时我们会遭遇到一个非常棘手的问题——文件突然出现乱码。当你满怀期待地插入U盘&#xff0c;准备打开某个重要文件时&#xff0c;却发现文件名或内容变成了一堆无法识别的字符&#xff0c;这种心情无异于晴天霹雳。乱码文件不仅影响了我们…

数据结构------二叉树经典习题1

博主主页: 码农派大星. 关注博主带你了解更多数据结构知识 1判断相同的树 OJ链接 这道题相对简单,运用我们常规的递归写法就能轻松写出 所以我们解题思路应该这样想: 1.如果p为空&#xff0c;q为空&#xff0c;那么就是两颗空树肯定相等 2.如果一个树为空另一棵树不为空那么…

Android 应用开发-实现将公共存储空间内的文件复制到应用的私用存储空间中

一、前言 几个月前&#xff0c;我用Android Studio给公司销售部门的同事开发了一款手机app&#xff0c;让同事们用自己的手机就能进行商品的扫码盘点操作&#xff0c;帮他们提高了工作效率&#xff0c;他们用了一段时间&#xff0c;反映还不错。不过前几天&#xff0c;销售部门…

洗衣洗鞋店做小程序有什么优势?

互联网洗衣洗鞋小程序闪亮登场&#xff0c;想知道这款小程序有何魅力吗&#xff1f; 如今&#xff0c;众多商家纷纷推出预约上门洗鞋服务&#xff0c;&#x1f481;‍♀️并倾力打造洗鞋小程序&#xff0c;旨在拓展线上销售渠道。&#x1f31f;那么&#xff0c;这款洗鞋小程序究…

libsndfile读取wav文件基本属性

本文的目的是提供一种方法读取wav文件的基本属性&#xff1a;音频帧数&#xff0c;格式、通道数和采样率信息。 代码如下所示&#xff1a; #include <iostream> #include <QDebug> #include "sndfile.h"using namespace std;int main() {// 初始化 ALS…

Gradio

文章目录 关于 Gradio安装InterfaceChatInterface TextBlocksSentence BuilderDiff Texts MediaSepia FilterVideo IdentityIterative OutputGenerate Tone TabularFilter RecordsVideo IdentityIterative OutputGenerate Tone TabularFilter RecordsTranspose MatrixTax Calcu…

C++ 日志库 log4cpp 编译、压测及其范例代码 [全流程手工实践]

文章目录 一、 log4cpp官网二、下载三、编译1.目录结构如下2.configure 编译3.cmake 编译 四、测试五、压测源码及结果1.运行环境信息2.压测源码3.压测结果 文章内容&#xff1a;包含了对其linux上的完整使用流程&#xff0c;下载、编译、安装、测试用例尝试、以及一份自己写好…

20232906 2023-2024-2 《网络与系统攻防技术》第十次作业

20232906 2023-2024-2 《网络与系统攻防技术》第十次作业 1.实验内容 一、SEED SQL注入攻击与防御实验 我们已经创建了一个Web应用程序&#xff0c;并将其托管在http://www.seedlabsqlinjection.com/&#xff08;仅在SEED Ubuntu中可访问&#xff09;。该Web应用程序是一个简…

Qt多文档程序的一种实现

注&#xff1a;文中所列代码质量不高&#xff0c;但不影响演示我的思路 实现思路说明 实现DemoApplication 相当于MFC中CWinAppEx的派生类&#xff0c;暂时没加什么功能。 DemoApplication.h #pragma once#include <QtWidgets/QApplication>//相当于MFC中CWinAppEx的派生…