Blazor也可以用MarkDown!Vditor-Blazor基础使用教程以及部分源码解析!Ant-Designer-Blazor

news2024/11/23 23:49:59

前言

Ant-Designer-Blazor组件库是一款非常好用的Blazor的UI框架库,使用很少的精力就可以搭建出一个漂亮的UI界面了。
但是Ant-Designer-Blazor中尚缺少对MarkDown组件的支持,所以只能下载Nuget包里面的一个Vditor(也是Ant-Designer的)一个库,来添加到项目中使用。它的源码并不复杂,使用也很简单,本质上是一个“对Vditor JavaScript的封装”,让我们开始吧。

快速上手

STEP1:添加Nuget包

为Blazor项目添加Nuget包:
搜索Vditor,选择下图第一个安装,为你想要这个MarkDown功能的项目添加。
在这里插入图片描述
安装完成后,检查项目依赖:
在这里插入图片描述

STEP2:配置一下项目

WebAssembly版本:

在_Imports.razorz中添加,如下代码。
@using Vditor
在wwwroot/index.html文件下,添加如下内容。

<!-- ⚠️Please specify the version number in the production environment, such as https://cdn.jsdelivr.net/npm/vditor@x.x.x/dist... -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/vditor@3.8.7/dist/index.css" />
<script src="https://cdn.jsdelivr.net/npm/vditor@3.8.7/dist/index.min.js" defer></script>

<script src="_content/Vditor/vditor-blazor.js"></script>

这里的@x.x.x看Nuget包中的版本,看STEP1中最后一张图,用的是3.8.7版本,所以@x.x.x写3 8 7。

Service版本:

和上面差不多,简单讲讲。
在_Host.cshtml中添加

<!-- ⚠️Please specify the version number in the production environment, such as https://cdn.jsdelivr.net/npm/vditor@x.x.x/dist... -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/vditor@3.4.7/dist/index.css" />
    <!--<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/vditor@3.4.7/dist/css/content-theme/ant-design.css" />-->
    <script src="https://cdn.jsdelivr.net/npm/vditor@3.4.7/dist/index.min.js" defer></script>
    <script src="_content/Vditor/vditor-blazor.js"></script>

注意修改版本号,和Nuget里面的那个版本要对应起来哦。

STEP3:开始使用

效果图:
在这里插入图片描述
渲染MarkDown文件也不在话下:
在这里插入图片描述

先进的MarkDown Editor

在Razor页面中,添加一行:

<Vditor.Editor @ref="editor" @bind-Value="value" @bind-Html="html" Mode="wysiwyg" Height="500" MinHeight="500" Toolbar="Toolbar" OnToolbarButtonClick="OnToolbarButtonClick" Upload="upload" />

在对应Code部分:

string value = "Hello Blazor!";
    string html;

    Editor editor;
    Toolbar Toolbar = new Toolbar();
    Upload upload = new Upload() {
        Url = "api/upload",
        Max = 2 * 1024 * 1024,
        Accept = "image/*,*.doc,*.docx",
        Multiple = false,
    };

    protected override void OnInitialized()
    {

        string[] keys = { "emoji",
            "headings",
            "bold",
            "italic",
            "strike",
            "link",
            "|",
            "list",
            "ordered-list",
            "check",
            "outdent",
            "indent",
            "|",
            "quote",
            "line",
            "code",
            "inline-code",
            "insert-before",
            "insert-after",
            "|"};

        Toolbar.Buttons.AddRange(keys.ToList());

        CustomToolButton toolbar = new CustomToolButton()
        {
            ClassName = "right",
            Hotkey = "⌘-⇧-S",
            Icon = "<svg><use xlink:href=\"#vditor-icon-export\"></use></svg>",
            Name = "sponsor",
            Tip = "自定义Toolbar",
            TipPosition = "n"
        };

        Toolbar.Buttons.Add(toolbar);

        string[] keys2 = {"upload",
            "record",
            "table",
            "|",
            "undo",
            "redo",
            "|",
            "fullscreen"};
        Toolbar.Buttons.AddRange(keys2.ToList());

        base.OnInitialized();
    }

    async Task Click()
    {
        var value = await editor.GetValueAsync();
        Console.WriteLine(value);
    }

    void Rendererd()
    {
        Console.WriteLine("rendererd!");
    }

    void OnToolbarButtonClick(string name)
    {
        value += $"\r\ncustom button {name} was clicked.";
    }

详细的解释:在Razor文件中Vditor.Editor中,@ref是对这个组件的应用,之后可以使用editor这个变量进行一些操作了。Mode是渲染模式,支持三种模式,和Vditor(JavaScript)版本是一样的。Toolbar是自定义的工具栏,请看代码理解,也可以不自定义,这个Toolbar可以不用赋值。OnToolBarButtonClick是一个回调函数,当点击Toolbar之后的回调。@bind-Value是双向绑定,绑定用户输入到MarkDown的内如,是一个字符串,注意,需要使用@bind-,因为这样才是双向绑定。配置Upload是在用户在MarkDown中添加图片,或者DOCX的时候,将资源文件返回给服务器,然后服务器响应数据再回给我们,最后显示在MarkDown中。

我们还可以使用很多回调,比如获得焦点啥的,具体请看Vditor的API:https://ld246.com/article/1549638745630

MarkdownEditor最简单的使用方法

Razor文件中:

<Vditor.Editor Mode="wysiwyg" Height="300" MinHeight="200" @bind-Value="@mdValue"></Vditor.Editor>

注意自己配置一下Upload
Code文件中:

string mdValue = "";

渲染MarkDown

很简单,只需要:

<Vditor.Preview Height="500" MinHeight="500" Markdown="@mdValue"></Vditor.Preview>

Markdown中绑定一个string类型的数据。

查看Vditor的API指南:

https://ld246.com/article/1549638745630

Vditor-Blazor源码解析:

找到了两份,下面这个是添加到Nuget里面的代码
https://github.com/StardustDL/razorcomponents/blob/master/src/Vditors/VditorModule.cs
另外一份是
https://gitee.com/ant-design-blazor/vditor-blazor?_from=gitee_search

我们使用下面那一份源码来康康里面实现了啥:
在这里插入图片描述这个文件中,我们发现,它真正的操作就是在调用JSRuntime,来实现对JS的交互。
第9行代码:[Inject] private IJSRuntime Js { get; set; }通过注入,我们可以使用Js。
看11行到14行

        public async Task CreateVditor()
        {
            await Js.InvokeVoidAsync("vditorBlazor.createVditor", _ref, DotNetObjectReference.Create(this), this.Value, this.Options);
        }

通过调用JS方法,来创建一个Vditor,并且根据Options和Value啥的,还有一个_ref应用。
这些东东在本类的另一个文件中。
打开Editor.razor.cs,我们发现它在做这几样事情,首先是_ref变量,它是一个ElementReference类型,位于第66行。然后是Options变量,在40行。

public Dictionary<string, object> Options { get; set; }

也很简单,就是设定一些东东,在这里插入图片描述
然后这些东东会随着Js一起调用,想想我们是怎么在Js中调用的,一样的道理。
在这里插入图片描述
去看看Vditor官网的Js中的Api吧!

然后就是一些SetValue之类的方法:

        public async Task SetValue(string value, bool clearStack = false)
        {
            await Js.InvokeVoidAsync("vditorBlazor.setValue", _ref, value, clearStack);
        }

还是Js的操作哦,似乎没有什么太难以理解的地方,因为它的源码就是这样的。


小熊内心OS:既然都使用了Blazor,当然希望前端都是C#写的啦!期待AntDesign团队,早日可以将C#实现的Vditor带到我们的面前!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计师常用网站,建议收藏

这几个设计师常用网站&#xff0c;你不知道就落后了 设计党赶紧收藏&#xff01;1、菜鸟图库 https://www.sucai999.com/?vNTYwNDUx 免费设计素材。 站内平面海报、UI设计、电商淘宝、免抠、高清图片、样机模板等素材非常齐全。还有在线抠图、CDR版本转换功能&#xff0c;能有…

坦克大战③

1.防止敌人坦克重叠运动 八种情况 这辆敌方坦克和任何其它敌方坦克都不发生碰撞时且不超边界时才可以移动 2.记录玩家成绩 绘制版面信息 paint()方法中如果没有super.paint(g)&#xff0c;那么绘制的敌方坦克数会出现重叠情况 调用方法 在Recorder类中定义一个方法…

Java 性能诊断工具简介-EJ Technologies JProfiler 12.0.5 中文激活版

目录 JProfiler 这篇文章讲解的比较详细&#xff1a; 可以辅助命令&#xff0c;应用jar的启动命令&#xff1a; 同时在开发工具里面添加一个JProfiler插件 JProfiler 这篇文章讲解的比较详细&#xff1a; JVM性能分析工具 Jprofiler - 百里浅暮 - 博客园 我在这里记录下。…

MATLB|电动汽车充放电的最优调度

目录 一、概述 二、电动汽车 2.1 电动汽车的类型 2.2电动汽车行程开始时间 2.3 电动汽车行驶里程 三、Matlab实现 3.1 代码前的准备 3.2 运行结果 四、往期回顾 五、Matlab代码实现 一、概述 电动汽车能够良好发展离不开精确的电动汽车充电负荷预测,目前,大多数充电负…

2022全年度烘干机十大热门品牌销量榜单

在“宅经济”时代&#xff0c;人们对大家电的需求持续高速增长。在当前的大环境下&#xff0c;人们的健康意识在不断提高&#xff0c;拥有除菌防菌功能的烘干机也更受欢迎。因此&#xff0c;烘干机作为快速进入普及阶段的家电新品&#xff0c;市场增长空间非常大。 根据鲸参谋数…

RCE绕过靶场练习

目录 CTF-01 CTF-02 CTF-03 CTF-04 CTF-05 CTF-01 测试回显 Array ([0] > PING 127.0.0.1 (127.0.0.1): 56 data bytes[1] > 64 bytes from 127.0.0.1: seq0 ttl42 time0.028 ms[2] > 64 bytes from 127.0.0.1: seq1 ttl42 time0.059 ms[3] > 64 bytes from …

Javascript 面向对象的缺陷,父类能调用被子类重写后的方法

问题背景 前些天做项目练手时&#xff0c;遇到一个需要写类的场景&#xff0c;各个类之间的交互我打算用事件的方式进行&#xff0c;就自然地在父类继承了EventEmitter类。然后在父类对一个具体事件注册了一个默认监听&#xff0c;子类通过注册自己专有的监听细化逻辑。代码逻…

win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决

win7关闭驱动签名&#xff0c;进入驱动测试模式win7、win10关闭驱动签名、进入驱动测试模式DebugView工具运行提示"Dbgv.sys: 拒绝访问"驱动项目配置属性常用设置驱动中KdPrint打印UNICODE_STRING字符串常用方法没使用的变量在编译时报警告&#xff1a;未引用的形参错…

文字转语音真人发声软件哪个好?这些实用软件快来收好

平时大家结束了一天的工作&#xff0c;会不会在空闲时间好好放松一下呢&#xff1f;如果是坐公交车或者地铁的小伙伴&#xff0c;想要在下班途中看一些电子书籍或者新闻&#xff0c;却因为下班高峰期人潮拥挤&#xff0c;导致无法腾出手来阅读&#xff0c;这时候你们会怎么解决…

红队基础知识

文章目录红队前置准备网络攻击链工程和操作攻击性思维渗透测试漏洞研究软件开发基础设施网络和系统逆向工程社会工程学物理安全威胁情报安全事件的检测和响应技术写作培训与汇报总结红队前置准备 红队通常指在对抗情况下需要仿真、模拟或以其他方式扮演某个、某组入侵者或理论…

【Docker】(一)基本概念与安装使用

1.概述 最近学习了Docker的使用&#xff0c;想通过一个系列的笔记来记录学习的过程与收获&#xff0c;并为以后的生产工作提供指导。 我一直认为学习一门技术时&#xff0c;需要先了解这门技术的基本概念&#xff0c;了解它能解决的问题&#xff0c;这样才能定位明确的学习目标…

frp内网穿透https

在公网服务器搭建frps(service)&#xff0c;在内网本地机子搭建frpc(client)&#xff0c;流量通过访问公网ip&#xff0c;经过frps服务端转发到fprc客户端&#xff0c;fprc再转发到本地web应用。 官方下载地址​ https://github.com/fatedier/frp/releases 官方文档地址https…

智能门锁“激战正酣”

近年来&#xff0c;智能化已经成为了高频词&#xff0c;越来越多的行业都在朝着智能化方向发展&#xff0c;家居行业也不例外。受技术升级、居民收入水平提高等多重因素影响&#xff0c;整个智能家居行业呈现出了蓬勃发展态势。据亿欧智库预测&#xff0c;2025年中国智能家居市…

客运车票网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 题目&#xff1a;基于Wb的公路客运车票信息管理系统设计与实现 时了解客运站动态。 角色&#xff1a;乘客、管理员 (2)车…

[附源码]Node.js计算机毕业设计-高校人事管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

C++设计模式的个人理解 繁琐的底层需要合理设计

一、为什么会有设计模式 由于每个人自身的能力、所在的层次、看问题的角度都不同&#xff0c;仅凭直觉“对现实建模”&#xff0c;很有可能会生成一些大小不均、职责不清、关系混乱的对象&#xff0c;最后搭建出一个虽然可以运行&#xff0c;但却难以理解、难以维护的系统。为此…

基于Java+Mysql实现酒店预订系统【100010045】

酒店预订系统 1.引言 1.1编制目的 1.详细完成对酒店预订系统的概要设计&#xff0c; 2.达到指导详细设计和开发的目的&#xff0c; 3.同时实现和测试人员及用户的沟通。 3.本报告面向开发人员&#xff0c;测试人员及最终用户的编写额&#xff0c;是了解系统的导航。 1.2…

Flink基本转换算子

文章目录1.映射&#xff08;map&#xff09;2.过滤&#xff08;filter&#xff09;3.扁平映射&#xff08;flatMap&#xff09;4.按键分区&#xff08;keyBy&#xff09;5. 简单聚合&#xff08;sum&#xff0c;min&#xff0c;max等&#xff09;6.归约聚合&#xff08;reduce&…

m基于LDPC+QPSK通信链路误码率matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 LDPC ( Low-density Parity-check&#xff0c;低密度奇偶校验&#xff09;码是由 Gallager 在1963 年提出的一类具有稀疏校验矩阵的线性分组码 (linear block codes)&#xff0c;然而在接下来的 …

第五届“强网”拟态防御国际精英挑战赛在南京举行——开辟网络安全新赛道 引领网络弹性新优势

12月15日&#xff0c;第五届“强网”拟态防御国际精英挑战赛在南京紫金山实验室隆重开幕&#xff0c;来自国内外60支顶尖战队将通过云上和线下相结合的方式展开72小时的高强度对抗。大赛组委会主席、紫金山实验室首席科学家、中国工程院邬江兴院士指出&#xff0c;本届挑战赛瞄…