再写树型列表

再写树型列表

  • HTML标签的选择
  • th:block的使用

以前用jQuery写过一个树型列表,当时选择采用jQuery或者说javascript实现的原因是可以动态获取数据,实现无限层级。现在又要用到这个东西,发现一个问题:其实大多数时候数据并不多,完全可以一次性加载,动态加载的必要性并不高。至于无限层级也不是使用客户端实现的理由,因为使用模板同样可以递归调用,同样能根据数据实现无限层级。至少现在使用的thymeleaf模板是支持的。所以就重写了一个,有新的心得如下:

HTML标签的选择

以前没有HTML5的时候,用html标签很随意,所以基本上都是用div来包装,现在仍然是用div,但想发不一样。按HTML5建议,应该尽量使用符合语义的标签,这种列表的话当然应该用ul或ol,并且,浏览器的用户代理样式表还会自动给予缩进,本来是最合适的。但是,如果想要替换前导符并且实现点击前导符而展开或收缩的功能的话,就只能用图形按钮实现前导符,这个时候要把按钮改为inline,还得要用div包装起来使得前导符和节点在一行。那还不如直接用div。如果直接用行内元素a当按钮,就要在事件处理程序中阻止其默认行为,这种用法很让人费解,还不如牺牲语义直接用div。另外,即使坚持用ul、ol,也还要把默认的缩进去掉,因为用list-style: none;去掉前导符号,自己加的前导符并不能代替那个位置,所以总体上有一个缩进,不太美观。用CSS去掉默认缩进当然也行,但如果直接用div就没这么多考虑的。所以,综合起来还是继续用div。

th:block的使用

以前没用过thymeleaf的唯一的标签(不是属性),即使是用th:each也是把其他th属性直接写后面。但现在需要用到模块引用就不能这样了。一开始是这样写的

 <div class="tree" th:with="nodedata=${tree}"><div th:fragment="treenode(nodedata)"><button type="button" th:if="${not #lists.isEmpty(nodedata.subordinate)}"><img th:src="@{/resources/images/chevron-right.svg}" width="16px" height="16px"></button><div th:text="${nodedata.name}" style="display:inline-block"></div><div th:if="${not #lists.isEmpty(nodedata.subordinate)}"><div th:each="child:${nodedata.subordinate}" th:replace="~{::treenode(${child})}"></div></div></div>
</div>

然后报空对像错误,查了很久才发现,thymeleaf的属性是有优先级的,而th:include和th:replace的优先级最高,th:each其次。以前一直把th:each与其他属性一起用没有发现,现在用到片断包含了,它就先替换了这个片断,所以th:each定义的循环变量就没有了,传的参数就成了null。这里即使是把th:replace换成th:include也不行,原因就是th:include优先级最高,先执行,这时候传的参数是空就已经错了,就算th:each仍然起作用,它会再次执行include也没用,之前就已经出错了。这时就需要用到th:block这个元素,把each放在外面。

<div class="tree" th:with="nodedata=${tree}"><div th:fragment="treenode(nodedata)"><button type="button" th:if="${not #lists.isEmpty(nodedata.subordinate)}"><img th:src="@{/resources/images/chevron-right.svg}" width="16px" height="16px"></button><div th:text="${nodedata.name}" style="display:inline-block"></div><div th:if="${not #lists.isEmpty(nodedata.subordinate)}"><th:block th:each="child:${nodedata.subordinate}"><div th:replace="~{::treenode(${child})}"></div></th:block></div></div>
</div>

其他相关的CSS、JavaScript变化、难度不大,不值得记录,就不粘出来了。

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

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

相关文章

break和continue区别及使用

break和continue是跳转控制语句&#xff0c;本篇文章将详细说明这两个的概念及作用。 1、continue 这张图是2024年3月的日期图&#xff0c;列出了每日和每周。 假设上面是上班工作日期&#xff0c;一个月有三十天&#xff0c;但是每周只有七天。简单思考一下&#xff0c;每周的…

el-select下拉框无法显示 elementplus踩坑日常

在使用el-select的时候参考了官方文档&#xff0c;但下拉框无法显示 解决办法1&#xff1a;检查是否没有按需引入eloption只引入了elselect 解决办法2&#xff1a;在el-select里面加入:popper-append-to-body"false" <el-select:popper-append-to-body"fa…

Mybatis八股

Mybatis是什么 Mybatis是一个半ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了JDBC&#xff0c;加载驱动、创建连接、创建statement等繁杂的过程&#xff0c;开发者开发时只需要关注如何编写SQL语句&#xff0c;可以严格控制sql执行性能&#xff0c;灵…

运行springboot项目提示:java: 错误: 不支持发行版本 18、java: 错误: 无效的源发行版:18

java: 错误: 不支持发行版本 18 解决方法&#xff1a;修改字节码版本&#xff0c;可以多试几次。 java: 错误: 无效的源发行版&#xff1a;18 解决方法&#xff1a; 出现这些错误原因&#xff1a; spring版本与jdk版本不对应 我的spring boot版本是3.2.2&#xff0c;对应的j…

实体店新模式:线下正规实体门店的转型与升级策略

在当今竞争激烈的市场环境下&#xff0c;线下正规实体门店需要不断转型与升级&#xff0c;以适应消费者的需求和市场的变化。 作为一名开鲜奶吧5年的创业者&#xff0c;我见证了无数实体店的成功与失败&#xff0c;下面的文章我将通过具体案例&#xff0c;为大家分享一些实用的…

YOLOv9如何训练自己的数据集(NEU-DET为案列)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文内容&#xff1a;教会你用自己数据集训练YOLOv9模型 YOLOv9魔术师专栏 ☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️ ☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️ 包含注意力机制魔…

【IVA】一个开源OPENIVAS智能分析系统的思考

一、框架选择 计划采用百度paddlepaddle的FastDeploy框架来进行推理&#xff0c;此套框架目前实现了多类硬件的支持&#xff0c;从cuda、openvino、npu、tpu、cpu等均能良好支持&#xff0c;而且支持快速部署。 二、硬件选择 硬件首选intel下 gpu、cpu&#xff0c;其次基于成…

C语言自学笔记5-----C 语言 if...else 语句

C 语言 if…else 语句 C 语言 if语句 ifC语言编程中该语句的语法为&#xff1a; 示例 if (test expression) { //测试表达式为真时,执行的语句 } if语句在括号()内评估测试表达式。 如果测试表达式的计算结果为true&#xff0c;则将if执行主体内部的语句。 如果测试表达式的计算…

CORS解决跨域

CORS解决跨域 后端服务器开启跨域支持&#xff1a; 方案一&#xff1a;在IndexController上添加**CrossOrigin**注解 RestController RequestMapping(value "/admin/system/index") CrossOrigin(allowCredentials "true" , originPatterns "*&q…

MyBatis拦截器四种类型和自定义拦截器的使用流程

文章目录 MyBatis拦截器四种类型和自定义拦截器的使用流程一、MyBatis拦截器四种类型的详细解释&#xff1a;1. **ParameterHandler 拦截器**&#xff1a;2. **ResultSetHandler 拦截器**&#xff1a;3. **StatementHandler 拦截器**&#xff1a;4. **Interceptor Chain 拦截器…

题目 2610: 第十二届省赛真题-杨辉三角形

题目描述: 下面的图形是著名的杨辉三角形&#xff1a; 如果我们按从上到下、从左到右的顺序把所有数排成一列&#xff0c;可以得到如下 数列&#xff1a; 1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, ... 给定一个正整数 N&#xff0c;请你输出数列中第一次出现 N 是在第几…

前端实现 查询包含分页 以及封装table表格 上手即用!

表格组件是 element plus 中的table 又经过了一层封装 封装的table代码在最底下 <div class"box2"><el-radio-group v-model"radio" style"margin-bottom: 16px"><el-radio-button label"1">类型1</el-radio…

Mybatis-plus手写SQL如何使用条件构造器和分页

Mybatis-plus手写SQL如何使用条件构造器和分页插件 前言&#xff1a;在使用mybatis-plus过程中&#xff0c;使用条件构造器和分页插件非常效率的提升开发速度&#xff0c;但有些业务需要使用连表查询&#xff0c;此时还想使用条件构造器和使用分页时应该如何操作呢&#xff1f…

论文学习——基于枢轴点预测和多样性策略混合的动态多目标优化

论文题目&#xff1a;A dynamic multi-objective optimization based on a hybrid of pivot points prediction and diversity strategies 基于枢轴点预测和多样性策略混合的动态多目标优化&#xff08;Jinhua Zheng a,b,d, Fei Zhou a,b,∗, Juan Zou a,b, Shengxiang Yang a…

mysql将一个表另存为新表,同时复制索引、约束、主键等信息

使用 SHOW CREATE TABLE 语句获取原表的创建语句&#xff1a; SHOW CREATE TABLE 原表名;将 原表名 替换为要复制的原始表的名称。 此语句将返回一个包含原表完整创建语句的结果集。创建语句包括表的结构、列定义、索引、约束、主键等所有信息。 复制结果集中的创建语句&…

java集合框架——Collection集合概述

前言 之前学过ArrayList&#xff0c;现在接触到更多集合了。整理下笔记&#xff0c;打好基础&#xff0c;daydayup! 集合体系结构 集合分为单列结合和双列结合&#xff0c;Collection代表单列集合&#xff0c;每个元素只包含一个值。Map代表双列集合&#xff0c;每个元素包含两…

HCIP —— BGP 的社团属性

目录 BGP 的社团属性 1.0X00000000 --- internet 2.0XFFFFFF02 --- no - advertise 3.0XFFFFFF01 --- no - export 4.0XFFFFFF03 --- no-export-subconfed 配置&#xff1a; 第一步&#xff1a;使用路由策略执行对流量打上社团属性 第二步&#xff1a;在对等体通告路由之…

智慧城市与绿色出行:共同迈向低碳未来

随着城市化进程的加速&#xff0c;交通拥堵、空气污染、能源消耗等问题日益凸显&#xff0c;智慧城市与绿色出行成为了解决这些问题的关键途径。智慧城市利用信息技术手段&#xff0c;实现城市各领域的智能化管理和服务&#xff0c;而绿色出行则强调低碳、环保的出行方式&#…

1.Python是什么?——《跟老吕学Python编程》

1.Python是什么&#xff1f;——《跟老吕学Python编程》 Python是一种什么样的语言&#xff1f;Python的优点Python的缺点 Python发展历史Python的起源Python版本发展史 Python的价值学Python可以做什么职业&#xff1f;Python可以做什么应用&#xff1f; Python是一种什么样的…

Servlet常见接口功能介绍

1.init&#xff08;&#xff09;接口 在Servlet实例化后&#xff0c;Servlet容器会调用init&#xff08;&#xff09;方法来初始化该对象&#xff0c;主要是为了是Servelt对象在处理客户请求前可以完成一些初始化工作。如&#xff1a;建立数据库的连接&#xff0c;获取配置信息…