前言

之前在这篇文章 基于.NetCore开发博客项目 StarBlog - (8) 分类层级结构展示 中说到,我为了让文章分类列表支持层级结构,用了一个树形组件,不过这个组件太老了,使用的Bootstrap版本居然是3.x的,但又找不到更好的,只能硬着头皮用。

但实际效果有很多我不满意的,感谢开源,我直接fork一份代码来魔改,实现了我要的效果~

然后还上传了npm~(第一次在npm上发包)

有需要的同学可以install试试:

  1. npm i bootstrap5-treeview

效果

先放图,后面再来说改了啥

布局修改

我注意到原版对tag的处理是包装成一个badge直接放在文字后面,不知道是不是Bootstrap改了,在目前的5.x版本上看起来挤在一起,而且也没有颜色,因为原版作者只加了badge一个class

我直接在js代码里找到这个badge的定义,修改!

  1. Tree.prototype.template = {
  2. // ...
  3. badge: '<span class="ms-1 badge bg-primary rounded-pill"></span>'
  4. };

加上了背景色和圆角,效果就好看多了~

然后!挤在一起的问题还没解决,原本的实现渲染出来大概这样的HTML

  1. <ul class="list-group">
  2. <li class="list-group-item">An item</li>
  3. <li class="list-group-item">A second item</li>
  4. <li class="list-group-item">A third item</li>
  5. <li class="list-group-item">A fourth item</li>
  6. <li class="list-group-item">And a fifth one</li>
  7. </ul>

理想情况下是两边分布,用flex布局正好实现,渲染出来应该类似这样

  1. <ol class="list-group">
  2. <li class="list-group-item d-flex justify-content-between align-items-start">
  3. <div>Subheading</div>
  4. <span class="badge bg-primary rounded-pill">tag</span>
  5. </li>
  6. </ol>

但原本这个组件是把所有元素一个个append到list-group-item里面,就导致出来的效果不美观

没事,代码在手,改!

首先重新定义几个元素模板

包括上面的badge也在里面,所有元素模板在这

  1. Tree.prototype.template = {
  2. list: '<ul class="list-group"></ul>',
  3. itemWrapper: '<li class="list-group-item d-flex justify-content-between align-items-start"></li>',
  4. itemLeftElem: '<div class="w-100"></div>',
  5. itemRightElem: '<div></div>',
  6. indent: '<span class="mx-2"></span>',
  7. icon: '<span class="icon"></span>',
  8. link: '<a class="w-75" href="#" style="display:inline-block; color:inherit; text-decoration:none;"></a>',
  9. badge: '<span class="ms-1 badge bg-primary rounded-pill"></span>'
  10. };

然后找到组装列表元素项的代码

Tree.prototype.buildTree这里,里面有个$.each(nodes, function addNodes(id, node)循环体

直接改代码

  1. // 最外层包装
  2. let treeItem = $(_this.template.itemWrapper)
  3. .addClass('node-' + _this.elementId)
  4. .addClass(node.state.checked ? 'node-checked' : '')
  5. .addClass(node.state.disabled ? 'node-disabled' : '')
  6. .addClass(node.state.selected ? 'node-selected' : '')
  7. .addClass(node.searchResult ? 'search-result' : '')
  8. .attr('data-nodeid', node.nodeId)
  9. .attr('style', _this.buildStyleOverride(node));
  10. // item 内分成两个元素,用flex布局分布在左右两边
  11. let treeItemLeft = $(_this.template.itemLeftElem)
  12. let treeItemRight = $(_this.template.itemRightElem)
  13. treeItem.append(treeItemLeft)
  14. treeItem.append(treeItemRight)

然后把tag渲染代码改成这样

  1. // Add tags as badges
  2. if (_this.options.showTags && node.tags) {
  3. $.each(node.tags, function addTag(id, tag) {
  4. treeItemRight.append(
  5. $(_this.template.badge).append(tag)
  6. );
  7. });
  8. }

其他元素全都append到treeItemLeft元素下

增加缩进控制

原版没办法控制是否开启子菜单缩进,默认是开启,我给加了个选项控制开启

  1. _default.settings = {
  2. // ...
  3. enableIndent: true, // 添加了控制是否启用缩进的开关
  4. }

然后依然是在上面的那个$.each(nodes, function addNodes(id, node)循环里,加个判断就搞定了

  1. // Add indent/spacer to mimic tree structure
  2. // 添加了控制是否启用缩进的开关
  3. if (_this.options.enableIndent) {
  4. for (let i = 0; i < (level - 1); i++) {
  5. treeItemLeft.append(_this.template.indent);
  6. }
  7. }

上传NPM

第一次在NPM上发包,(也算是为开源社区做贡献了)

参考了这篇文章:https://segmentfault.com/a/1190000013940567

首先在NPM官网注册一个账号,然后本地使用npm login登录

完事了在项目的根目录下执行:npm publish就好了

当然我这个是fork的,要把package.json里的信息改一下,不然会和原作者的包冲突没法上传。

小结

魔改前端组件和在NPM发包这的门槛真的是很低,让我想起了之前在pip上发python包的经历,也是类似的操作,一键提交,直接起飞~

不过相比之下,NPM甚至比pip还更容易一点,至少没遇到什么障碍,也不需要额外安装什么就完成了

(唯一的障碍是这个包的依赖太老,grunt的上古版本我安不上,后面装了新版才可以执行任务)

代码

完整代码在github:https://github.com/Deali-Axy/bootstrap5-treeview

然后NPM地址:https://www.npmjs.com/package/bootstrap5-treeview

有需要实现树形结构的同学可以试试,感觉还行~

魔改了一下bootstrap-treeview组件,发布个NPM包体验一下的更多相关文章

  1. krry-transfer ⏤ 基于 element 的升级版穿梭框组件发布到 npm 啦

    博客地址:https://ainyi.com/81 基于 element ui 的==升级版穿梭框组件==发布到 npm 啦 看过我之前博客的同学或许知道我之前写过关于 element 穿梭框组件重构 ...

  2. 如何发布一个npm包(基于vue)

    前言:工作的时候总是使用别人的npm包,然而我有时心底会好奇自己如何发布一个npm包呢,什么时候自己的包能够被很多人喜欢并使用呢...今天我终于迈出了第一步. 前提:会使用 npm,有 vue 基础, ...

  3. 从0到1发布一个npm包

    从0到1发布一个npm包 author: @TiffanysBear 最近在项目业务中有遇到一些问题,一些通用的方法或者封装的模块在PC.WAP甚至是APP中都需要使用,但是对于业务的PC.WAP.A ...

  4. (转)前端开发-发布一个NPM包之最简单易懂流程

    原文地址:https://www.cnblogs.com/sghy/p/6829747.html 1.npm官网创建npm账户 npm网站地址:https://www.npmjs.com/ npm网站 ...

  5. 如何发布一个包到npm && 如何使用自己发布的npm包 && 如何更新发布到npm的package && 如何更新当前项目的包?

    如何发布一个包到npm First 在https://www.npmjs.com注册一个账号. Second 编辑好项目,文件大致如下: 其中,gitignore可以如下: .DS_Store nod ...

  6. 如何发布一个npm包?

    npm包在现在前端开发中经常使用且便利,而我也是经常使用,而没研究怎么去发布npm.那如何发布npm包呢? 一.在npm的官网上注册一个账号登录,https://www.npmjs.com/ 注意此步 ...

  7. 发布一个npm包(webpack loader)

    发布一个npm包,webpack loader: reverse-color-loader,实现颜色反转. 初始化项目 mkdir reverse-color-loader cd ./reverse- ...

  8. vue-cli3.0 vue组件发布到npm

    一.创建项目 1.vue create xxx (使用的版本是3.1.0) 2.把src目录名称改为examples 3.新建文件夹packages 用来存放组件 4.比如:新建Button组件 in ...

  9. 使用Vue CLI 3将基于element-ui二次封装的组件发布到npm

    前言:之前在网上找的好多都是基于vue-cli 2.x的,而使用vue-cli 3的文章比较少,Vue CLI 3 中文文档,所以我在自己尝试的时候把几篇文章结合了一下,调出来了我想要的模式,也就是V ...

随机推荐

  1. 人机交互BS

    B/S结构用户界面设计       [实验编号] 10003809548j Web界面设计 [实验学时] 8学时 [实验环境] l  所需硬件环境为微机: l  所需软件环境为dreamweaver ...

  2. SimpleDateForma求日期,2008-11月第6周星期日是几号?

    题目4: 巧妙利用SimpleDateFormat根据各种信息求日期.2008-11月第6周的星期日是几号? import java.text.ParseException;import java.t ...

  3. node安装和环境配置

    参考链接: https://www.cnblogs.com/zwjphp/p/14123746.html 一.安装环境 1.本机:Windows 10 (64位) 2.Node.js:v12.13.0 ...

  4. 引入css的方式

    ---恢复内容开始--- 引入css的样式及link和@import的区别 有3种引入方式 1.内部样式(写在标签内) 2.内联样式 3.外部样式(link @import) 区别: 1.本质区别:l ...

  5. 解决stram++的host代理443端口被占用的问题(电脑有虚拟机进!!)

    解决stram++的host代理443端口被占用的问题 一.steam++ 最近在用steam++这个开源且功能强大的加速器,过多就不介绍了 主页地址跳转:Steam++ - 主页 (steampp. ...

  6. C++---变量、数据类型和运算符

    内存 计算机使用内存来记忆或存储计算时所使用的的数据. 计算机执行程序时, 组成程序的指令和程序所操作的数据都必须存放在某个地方, 而这个地方就是计算机的内存, 也称为主存, 或随机访问存储器(RAM ...

  7. 基于LAMP离线部署zabbix3.2.11

    zabbix是个什么东西这里不再赘述,先安装lamp再安装zabbix. 1.   安装依赖插件(把下面PHP那些依赖库全部都装了) #yum install -y gcc gcc-c++ opens ...

  8. echarts饼图去除圈外指向横线

    series: [ { name: '实时人员信息', type: 'pie', radius: ['86%', '80%'], avoidLabelOverlap: false, label: { ...

  9. instanceof 和类型转换

    instanceof 和类型转换 instanceof 判断a 和 B 类型是否相似 公式 System.out.println(a instanceof B); //true / false 编译是 ...

  10. zabbix 6.0 docker-compose 部署

    zabbix 6.0 docker-compose 部署 zabbix6.0 已是新LTS版本.根据zabbix-docker上的trunk版本来搭建zabbix6.0. 根据踩坑,记录docker- ...