基于element-ui封装可搜索的懒加载tree组件的实现


Posted in Javascript onMay 22, 2020

引言

最近开发项目时遇到一个需求就是采用tree的方式展示以万为单位的数据,因为数据量大第一反应就是采用“懒加载”的方式实现,为了方便用户在庞大的数据量中快速定位到某个节点搜索功能也是必不可少的;因为采用“懒加载”数据,搜索当然也是远程搜索了;确定了需求当然第一时间就去网上找有没有小伙伴已经实现了相关组件,最后....,还是自己实现一个吧(由于公司采用的element-ui所以基于el-tree进行改造);【这只是自己实现的一种思路,希望大家多多指正】

1.懒加载树的实现

刚开始准备直接采用el-tree自带的懒加载方式,但在实现过程中发现el-tree采用懒加载后没有展开树节点,这显然行不通;思来想去懒加载不就是展开节点时再去加载数据吗,我采用非lazy的形式自己控制就行了啊,于是有了下面的实现:

// 数据格式要求
const treeData = [
 {
  label: '节点1',
  id: '1',
  children: [] // 为了显示展开的小箭头凡是有子节点就需要带上 
 },
 {
  label: '节点2',
  id: '2'
 }
]

在拿到上面的数据后我会对数据进行一些处理来实现展开时加载子节点数据,具体如下:

基于element-ui封装可搜索的懒加载tree组件的实现

基于element-ui封装可搜索的懒加载tree组件的实现

// 执行后数据变成下面的形式
const treeData = [
 {
  label: '节点1',
  id: '1',
  children: [
   // 渲染节点时通过_state_来标识显示加载状态,如果网络中断加载失败
   //_state_ = 1,可点击重新加载再次索要数据,不用关闭节点再展开去加载
   // 之所以都加载id,是为了给el-tree添加node-key,方便树的操作使用,具体见elementUI文档
   {id: '1-test', '_state_': 0}
  ] // 为了显示展开的小箭头凡是有子节点就需要带上 
 },
 {
  label: '节点2',
  id: '2'
 }
]

数据插入

基于element-ui封装可搜索的懒加载tree组件的实现

在展开节点时获取数据,然后获取到展开点插入便是,el-tree提供了对应方法;

到这里懒加载树基本上就做好了

2.远程搜索实现

远程搜索框主要采用了el-select的远程搜索功能,这里就不赘述了,主要介绍更具搜索选中的id获取的数据的和插入树节点方式:

要求数据格式

const nodeData = {
 label: '节点1', // 最上层节点
 id: '1',
 children: [
  {label: '节点1-1', id: '1-1', chilrend: []},
  {label: '节点1-2', id: '1-2', chilrend:[]} // 搜索对应id的节点
 ]
}

返回的数据就是你要获取的节点id的兄弟节点及父节点的所有兄弟节点依次类推,直到这个节点分支的的根节点;听起来有点绕,但是你可以脑补一下你展开这个节点后所有面上的节点你都是要有的;

将数据插入树中

基于element-ui封装可搜索的懒加载tree组件的实现

这段代首先会将数据和本地数据进行对比合并(刚开始设计时没有合并,采用直接替换的方式,因为需要基于这个树实现下拉选择组件【如果对下拉树组件感兴趣可以留言,我给大家分享下我的思路,相对而言比这个组件的封装复杂度要高一些】,并支持多选有默认值设置问题,才改为合并处理的方式;对比合并并不需要太多时间执行,因为新数据只会有一个节点与本地数据不同,所以还是很快的),然后找到本地需要插入数据的节点,执行插入即可;

3.效果图展示

基于element-ui封装可搜索的懒加载tree组件的实现

结语

这只是我个人对业务的一种解决方式,存在的不足还希望大家多指正;同时也希望得到大家的鼓励,让我在前端的道路上继续努力进步:grinning:。

参考链接

Vue

element-ui

到此这篇关于基于element-ui封装可搜索的懒加载tree组件的实现的文章就介绍到这了,更多相关element 可搜索懒加载tree内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jquery判断checkbox(复选框)是否被选中的代码
Oct 20 Javascript
jQuery实现的多选框多级联动插件
May 02 Javascript
JavaScript插件化开发教程 (二)
Jan 27 Javascript
javascript中createElement的两种创建方式
May 14 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
Sep 10 Javascript
Vue.js单向绑定和双向绑定实例分析
Aug 14 Javascript
在Vue-cli里应用Vuex的state和mutations方法
Sep 16 Javascript
详解vue 数组和对象渲染问题
Sep 21 Javascript
vue如何进行动画的封装
Sep 26 Javascript
解决layui的使用以及针对select、radio等表单组件不显示的问题
Sep 05 Javascript
Vue 2.0双向绑定原理的实现方法
Oct 23 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
Dec 23 Javascript
微信小程序点击滚动到指定位置的实现
May 22 #Javascript
使用JavaScript通过前端发送电子邮件
May 22 #Javascript
uni-app微信小程序登录授权的实现
May 22 #Javascript
jQuery 选择器用法实例分析【prev + next】
May 22 #jQuery
jQuery--遍历操作实例小结【后代、同胞及过滤】
May 22 #jQuery
uni-app使用微信小程序云函数的步骤示例
May 22 #Javascript
AutoJs实现刷宝短视频的思路详解
May 22 #Javascript
You might like
php下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
PHP服务器页面间跳转实现方法
2012/08/02 PHP
PHP 万年历实现代码
2012/10/18 PHP
php实现建立多层级目录的方法
2014/07/19 PHP
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
2010/12/28 Javascript
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
2014/04/04 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
2016/06/07 Javascript
Angular2 多级注入器详解及实例
2016/10/30 Javascript
jQuery实现拖动剪裁图片作为头像
2016/12/28 Javascript
Bootstrap进度条学习使用
2017/02/09 Javascript
JS验证全角与半角及相互转化的介绍
2017/05/18 Javascript
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
[59:32]Liquid vs Fnatic 2019国际邀请赛淘汰赛败者组BO1 8.20.mp4
2020/07/19 DOTA
Python命名空间详解
2014/08/18 Python
用Python计算三角函数之acos()方法的使用
2015/05/15 Python
Python利用flask sqlalchemy实现分页效果
2020/08/02 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
Python数据存储之 h5py详解
2019/12/26 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
2020/03/23 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
天游软件面试
2013/11/23 面试题
仓管员岗位职责范文
2013/11/08 职场文书
运动会通讯稿400字
2014/01/28 职场文书
公司营业员的自我评价
2014/03/04 职场文书
节约电力资源的建议书
2014/03/12 职场文书
成龙霸王洗发水广告词
2014/03/14 职场文书
房产委托公证书样本
2014/04/04 职场文书
2014年物资管理工作总结
2014/12/02 职场文书
汽车质检员岗位职责
2015/04/08 职场文书
交通安全教育主题班会
2015/08/12 职场文书
将MySQL的表数据全量导入clichhouse库中
2022/03/21 MySQL