最近更新一个Blazor server的项目,顺带把用到的Ant-Design-Blazor 升级到了最新的 0.14.4,结果发现之前在 0.8.4 版本中 Tree 组件的搜索显示效果变了,从仅显示找到的节点变成了在全部节点中高亮显示匹配的结果,为了节省用户沟通成本(就是懒得跟最终用户费口舌解释),于是自己动手把这个筛选效果找回来。

从 github 上拉取最新的 ant 代码回来,找到 Tree.Razor.cs 中的 SearchValue 属性,顺藤摸瓜找到 TreeNode.razor.cs 中的 RealDisplay 属性,参考 0.8.4 的实现把它改回去

internal bool RealDisplay
{
get
{
if (string.IsNullOrEmpty(TreeComponent.SearchValue))
{
//普通模式下节点显示规则
if (ParentNode == null) return true; //第一级节点默认显示
if (ParentNode.Expanded == false) return false; //上级节点如果是折叠的,必定折叠
return ParentNode.RealDisplay; //否则查找路径三的级节点显示情况
}
else
{
//筛选模式下不考虑节点是否展开,只要节点符合条件,或者存在符合条件的子节点是就展开显示
return Matched ||
HasChildMatched;
}

}
}

信心满满地运行,搜索结果的筛选效果确实是实现了,但是——所有匹配节点的上级节点全丢了——什么情况?原路找回 SearchNodes() 方法,应该是调用 node.OpenPropagation 方法时没有设置父节点的 HasChildMatched 属性,补上

internal void OpenPropagation()
{
this.Expand(true);
if (this.ParentNode != null)
{
this.ParentNode.HasChildMatched = true;
this.ParentNode.OpenPropagation();
}
}

这下才算是彻底恢复了之前的搜索结果的显示效果。个人感觉原来的筛选效果挺好的,即使新版本增加了 MatchedStyle 和 MatchedClass 突出显示结果,也可以保留筛选啊,想不通为啥要去掉。

因为是自己用,所以把生成的 AntDesign.dll 文件直接替换掉 C:\Users\用户名\.nuget\packages\antdesign\0.14.4\lib\net6.0 下的同名文件后 再重新生成引用它的项目就可以了。由于没有改动 AntDesign 的接口,其实直接替换发布目录下的同名文件应该也是可以的。

PS:借着这个机会,走马观花地学习了一下 AntDesign 的源代码,意外的发现一个动态生成 RenderFragment 的小技巧

var value = $"{start}<span class=\"{TreeComponent.MatchedClass}\" style=\"{TreeComponent.MatchedStyle}\">{match}</span>{end}";
<span>
@((MarkupString)value)
</span>

这显然比单独写函数返回 RenderFragment 直观省事得多。不过当 RenderFragment 作为模板时不能用函数传参了,需要通过 Inline 方式通过委托动态传参。例如要给 Table 组件的 FooterTemplate 传参

<Table FooterTemplate="@footer(sumValue)"
...省略了...
>
...也省略了...
</Table>

需要用以下方式

RenderFragment<float> footer = (v) => (RenderTreeBuilder __builder) =>
{
<span style="font-weight:bold">
预估金额总计: @v.ToString("¥0.00")
</span>
};

最后,感谢 Ant-Design-Blazor 的作者James Yeung和其他贡献者,感谢开源。

自己动手,通过源码找回 Ant-Design-Blaozr 中 Tree 组件的搜索筛选效果的更多相关文章

  1. 【高并发】通过源码深度分析线程池中Worker线程的执行流程

    大家好,我是冰河~~ 在<高并发之--通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程>一文中我们深度分析了线程池执行任务的核心流程,在ThreadPool ...

  2. react ,ant Design UI中table组件合并单元格并展开详情的问题

    需求:购物车订单列表,如图: 一:单元格合并 遇到这种你会怎么办呢?  单元格合并?  还是其他的方法? 下面是我的处理方式,就是在table 组件的columns上处理,这里拿商品举例,其余的类似, ...

  3. 通过源码了解ASP.NET MVC 几种Filter的执行过程

    一.前言 之前也阅读过MVC的源码,并了解过各个模块的运行原理和执行过程,但都没有形成文章(所以也忘得特别快),总感觉分析源码是大神的工作,而且很多人觉得平时根本不需要知道这些,会用就行了.其实阅读源 ...

  4. Linux下通过源码编译安装程序

    本文简单的记录了下,在linux下如何通过源码安装程序,以及相关的知识.(大神勿喷^_^) 一.程序的组成部分 Linux下程序大都是由以下几部分组成: 二进制文件:也就是可以运行的程序文件 库文件: ...

  5. 通过源码了解ASP.NET MVC 几种Filter的执行过程 在Winform中菜单动态添加“最近使用文件”

    通过源码了解ASP.NET MVC 几种Filter的执行过程   一.前言 之前也阅读过MVC的源码,并了解过各个模块的运行原理和执行过程,但都没有形成文章(所以也忘得特别快),总感觉分析源码是大神 ...

  6. 在centos6.7通过源码安装python3.6.7报错“zipimport.ZipImportError: can't decompress data; zlib not available”

    在centos6.7通过源码安装python3.6.7报错: zipimport.ZipImportError: can't decompress data; zlib not available 从 ...

  7. Kafka详解六:Kafka如何通过源码实现监控

    问题导读: 1.kafka的消费者组的消费偏移存储,kafka支持两个版本?        2.ConsumerOffsetChecker类的作用是什么?        3.Kafka如何通过源码实现 ...

  8. 通过源码编译安装VIM

    开发中使用的是Ubuntu 12.04 LTS,通过sudo apt-get install vim安装的版本较低,不支持YCM,所以,用源码编译并安装最新的Vim. 卸载旧版本的Vim: sudo ...

  9. echarts 通过源码方法 传入对应data数据获取分割步长值

    通过源码方法获取这里的分割数字长度 /** * Quantity of a number. e.g. 0.1, 1, 10, 100 * * @param {number} val * @return ...

  10. 通过源码安装PostgresSQL

    通过源码安装PostgresSQL 1.1 下载源码包环境: Centos6.8 64位 yum -y install bison flex readline-devel zlib-devel yum ...

随机推荐

  1. 20+前端常用的vscode插件(总结推荐)

    本篇文章给大家总结分享20多个前端常用的vscode插件.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 1. vscode 简介vscode是微软开发的的一款代码编辑器,就如官网上 ...

  2. 解决004--Loading local data is disabled; this must be enabled on both the client and server sides问题及解决

    因为下载了SQLyog的ultimate版本,现在就可以导入外部的数据了.有着之前使用insert into插入语句来添加近50条有着大概10个字段的记录的经历之后,本着能够导入现成的数据就导入的想法 ...

  3. 【Vue】Re15 Router 第二部分(缺省路由、动态路由)

    一.设置首页重定向: import Vue from 'vue'; import Router from 'vue-router'; import Home from "../compone ...

  4. SCC缩点模板

    struct SCC { int top = 0, cntscc = 0, dfncnt = 0, n; vector<int> dfn, low, stk, instk; vector& ...

  5. typeof、offsetof、container_of

      typeof 用于获取一个对象的类型,比如: unsigned int a = 1; // typeof (a) is unsigned int short b = 2; // typeof (b ...

  6. Atcoder ABC364 D-F

    Atcoder ABC364 D-F D - K-th Nearest 链接: D - K-th Nearest (atcoder.jp) 简要题意: 问题陈述 在一条数线上有 \(N+Q\) 个点 ...

  7. zabbix网络拓扑图介绍

    "zabbix network map"可以简单的理解为动态网络拓扑图,可以针对业务来配置zabbix map,通过map可以了解应用的整体状况:服务器是否异常.网络是否有故障.应 ...

  8. 初三奥赛模拟测试1--T1回文

    初三奥赛模拟测试1--\(T1\)回文 HZOI 题意 给定一个 \(n \times m\) 的,由字符组成的矩阵 \(A\) , 问你由 \(( 1 , 1 )\) 开始,点 \(( i , j ...

  9. Poetry 使用

    Poetry 是当下热门的 Python 包管理器.Poetry 注重为项目提供完整的生命周期管理,包括构建.打包.发布和依赖管理.其使用 pyproject.toml 文件来管理项目的依赖和构建配置 ...

  10. Web刷题之polarctf靶场(1)

    PolarCTF 1.XFF 打开靶场发现需要ip为1.1.1.1的用户才行, 打开BurpSuite进行抓包并对数据包进行修改,根据题目XFF提示 flag{847ac5dd4057b1ece411 ...