基于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 相关文章推荐
用js实现的检测浏览器和系统的函数
Apr 09 Javascript
实现连缀调用的map方法(prototype)
Aug 05 Javascript
Firefox下无法正常显示年份的解决方法
Sep 04 Javascript
JavaScript和CSS交互的方法汇总
Dec 02 Javascript
node.js中的url.format方法使用说明
Dec 10 Javascript
深入浅析JavaScript面向对象和原型函数
Feb 06 Javascript
浅谈JS继承_寄生式继承 & 寄生组合式继承
Aug 16 Javascript
iscroll动态加载数据完美解决方法
Jul 18 Javascript
JavaScript编写的网页小游戏,很给力
Aug 18 Javascript
React Native 截屏组件的示例代码
Dec 06 Javascript
element-ui多文件上传的实现示例
Apr 10 Javascript
TypeScript类型声明书写详解
Aug 28 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
基于mysql的bbs设计(五)
2006/10/09 PHP
php 代码优化的42条建议 推荐
2009/09/25 PHP
用PHP书写安全的脚本代码
2012/02/05 PHP
Google Suggest ;-) 基于js的动态下拉菜单
2006/10/11 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
jquery实现类似淘宝星星评分功能有截图
2014/09/15 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
Bootstrapvalidator校验、校验清除重置的实现代码(推荐)
2016/09/28 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
纯JS实现轮播图
2017/02/22 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
2017/03/15 Javascript
Form表单上传文件(type="file")的使用
2017/08/03 Javascript
Angular 开发学习之Angular CLI的安装使用
2017/12/31 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
vue打包相关细节整理(小结)
2018/09/28 Javascript
vue-router传递参数的几种方式实例详解
2018/11/13 Javascript
vue spa应用中的路由缓存问题与解决方案
2019/05/31 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
[50:17]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python中list初始化方法示例
2016/09/18 Python
Python简单实现控制电脑的方法
2018/01/22 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
django使用channels实现通信的示例
2020/10/19 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
HTML5 Web Database 数据库的SQL语句的使用方法
2012/12/09 HTML / CSS
印度在线杂货店:bigbasket
2018/08/23 全球购物
Lulu Guinness露露·吉尼斯官网:红唇包
2019/02/03 全球购物
英国排名第一的LED灯泡网站:LED Bulbs
2019/09/03 全球购物
思想专业自荐信范文
2013/12/25 职场文书
毕业生简历自我评价范文
2014/04/09 职场文书
2015年保管员工作总结
2015/04/30 职场文书
社区低保工作总结2015
2015/07/23 职场文书
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android