【vue-treeselect】数据量大的时候懒加载并且可以搜索,树懒加载+搜索

2023-10-26

这两天快被这个懒加载加搜索搞崩溃了
今天小有收获,后面优化了再更新
主要说一下一棵树如何懒加载和搜索
1、ref不解释了,和本次代码无关
2、normalizer格式化内容不重要
3、load-options很关键
4、 @search-change="itemInput"很关键
5、 @open="itemopen(rowIndex)"重要
6、@close="itemClose(rowIndex)"重要
7、 @keydown.native="assetTreeKeydownFun"很关键
8、 :async="Isasync"很关键
9、(优化) :default-expand-level=“defaultLevel”
10、(优化) open-direction=“bottom”
11、 (优化)@keyup.native=“assetTreeKeyupFun($event)”

<TreeSelect
                  :ref="'treeselect' + rowIndex"
                  v-model="row.assetTypeCode"
                  :options="deptOptions"
                  :normalizer="normalizer"
                  clearable
                  no-options-text="暂无可用选项"
                  noChildrenText="数据加载中"
                  noResultsText="暂无匹配项"
                  loadingText="数据加载中"
                  :matchKeys="['name', 'code']"
                  no-results-text="没有匹配的搜索结构"
                  placeholder="请选择资产分类名称"
                  searchPromptText="正在搜索"
                  style="width: 100%"
                  :appendToBody="true"
                  :disable-branch-nodes="true"
                  :load-options="Isasync ? asyncOptions : loadOptions"  
                  @search-change="itemInput"
                  @open="itemopen(rowIndex)"
                  @keydown.native="assetTreeKeydownFun"
                  @close="itemClose(rowIndex)"
                  @select="node => treeHandleSelect(rowIndex, node)"
                  :async="Isasync"
                   :default-expand-level="defaultLevel"
                   open-direction="bottom"
                    @keyup.native="assetTreeKeyupFun($event)"
                >
                  <div slot="option-label" slot-scope="{ node }" :style="{ marginLeft: !node.raw.children ? '16px' : '0' }">
                    [{{ node.raw.code }}]{{ node.raw.label }}
                  </div>
                  <div slot="value-label" slot-scope="{ node }">{{ row.assetTypeCode ? `[${row.assetTypeCode}]` : '' }}{{ row.assetTypeName }}</div>
                </TreeSelect>

2、文档很重要
延迟加载就是懒加载
在这里插入图片描述
异步搜索就是搜索功能
在这里插入图片描述
两个事件都用到了loadOption,那怎么触发,何时触发,以什么形式触发,光是这几点就花了我好长时间去研究。

肯定要有一个判断条件来决定何时触发哪个事件
关键就在于async是否启用异步搜索模式
在这里插入图片描述
有了这个就好办了,肯定不能默认为true,这样就不会走懒加载了,那就得找触发事件了

如果开启,就搜索,不开启就懒加载
:load-options="Isasync ? asyncOptions : loadOptions"

先在data中定义一下:

Isasync: false,
 defaultLevel: 0,

在这里插入图片描述
重要的就是open、close和search-change事件,我试过input,这个事件不会触发,不知道要加什么条件才能触发,不过不要紧,用search-change事件就可以
在用户搜索的时候打开异步搜索模式,这个有点缺陷,写到这才想起来,这个方法应该删掉才对,因为它是搜索到后才触发,会有个bug,就是第一次的时候不查,第二次的时候才触发,后来换成keydown,键盘按下就触发,就没这个bug了,所以改成下面这个
错误示范:

 itemInput(value) {
      this.Isasync = true  
    },

正确示范:优化点 this.defaultLevel = 5,当搜索到内容的时候,只展开一级,要点击才会一层一层展开,但是这里要的效果是全部展开,我默认给了5,如果还有很深的层级就写的再大一点

 assetTreeKeydownFun() {
      this.Isasync = true
       this.defaultLevel = 5
    },

为了不影响懒加载的正常使用,菜单打开和关闭的时候都要关掉异步加载,默认展开为0

    itemopen(index) {
      this.Isasync = false
      this.defaultLevel = 0
    },
    itemClose(index) {    
      this.Isasync = false
      this.defaultLevel = 0
    },

当清空输入框的时候遇到一个bug,无内容的时候还是显示正在搜索中,这个时候用键盘抬起事情
关闭懒加载

  assetTreeKeyupFun(e) {
      if (!e.target.value) {
        this.Isasync = false
        this.defaultLevel = 0
      }
    },

这里要注意一下,搜索是要后台配合的,后台把查到的数据直接返给我们,我们拿来直接用就行,我这里还遇到一个问题,就是查到的只有code没有label,尽管树插件的插槽里显示的是label,但是normalizer格式化的时候是把name转换成label的,在异步搜索这里好像没有走格式化,必须是label有值才行,后端把label和name都赋同样的值后,就可以正常显示了。

 normalizer(node) {
      if (node.children && !node.children.length) {
        delete node.children
      }
      return {
        id: node.code,
        label: node.name,    
        children: node.children,
      }
    },

如果后端返的内容不是树结构的,那就得自己处理成树结构的,用递归或别的,因为我直接就能拿到了,就懒得不写那一步啦

// treeselect树异步搜索
    asyncOptions({ action, searchQuery, callback }) {  
      if (action === ASYNC_SEARCH) {   
        findTreeselect({ searchValue: searchQuery }).then(res => {          
          const options = res.data.map(i => ({
            id: i.id,
            code: i.code,
            label: i.name,
            children: i.children,
          }))
          callback(null, options)
        })
      }
    },

树懒加载和树搜索是两个完全不同的接口,懒加载第一次请求的是根节点,传id后才拿到对应的子节点
所以页面初始化的时候就要调一次

// 获取根节点树数据
    getTreedata() {
      lazyTreeselect().then(res => {
        // this.deptOptions = res.data
        for (let index of res.data) {
          let modeInfo = {}
          modeInfo.id = index.id
          modeInfo.code = index.code
          modeInfo.label = index.name
          modeInfo.name = index.name       
          modeInfo.children = null
          this.deptOptions.push(modeInfo)
        }
      })
    },
 //treeselect 树懒加载
    loadOptions({ action, parentNode, callback }) {
      if (action === LOAD_CHILDREN_OPTIONS) {
        //加载点击节点的 子节点
        lazyTreeselect({ code: parentNode.code }).then(response => {
          let arr = []
          for (let index of response.data) {
            let chiledModeInfo = {}
            chiledModeInfo.id = index.id
            chiledModeInfo.code = index.code
            chiledModeInfo.label = index.name
            chiledModeInfo.name = index.name
            chiledModeInfo.children = null
            if (index.hasLeaf == '1') {
              delete chiledModeInfo.children
            }
            arr.push(chiledModeInfo)
          }
         
          parentNode.children = arr
        })
        callback()
      }
 
    },

结尾:需求搞出来之后,还是有点想哭的赶脚,前两天完全卡住了,写的也有问题,页面频发触发接口,不停的调,页面都奔溃过好几次。
放了两天之后,今天重新搞起来,还是稳住自己,沉下心去想。

有问题随时欢迎交流

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【vue-treeselect】数据量大的时候懒加载并且可以搜索,树懒加载+搜索 的相关文章

  • 为什么我的 Linux 应用程序引入了错误的 .so 库?

    我正在构建一个使用 NetCDF C 库的应用程序 并且 NetCDF 正在引入 HDF 4 库 然而 它正在拉动wrongHDF 4 库 我的应用程序的链接方式如下 apps1 intel bin icpc gxx name apps1
  • vue中有自动更新这段代码的东西吗?

    我在导航器中找到了这个按钮 当用户登录时会显示该按钮 而当用户注销时该按钮就会消失 但现在我需要在按钮删除 出现之前刷新页面 这是我的代码 Button div div class div div
  • 从vue中的api加载路由

    我正在尝试从我的 API 在 Vue 应用程序中加载路由 我尝试将数据推送到路由变量并使用 addRoutes 方法 但没有运气 我认为异步可能存在问题 但为什么 addRoutes 不起作用 这是我的代码 import Vue from
  • 打印堆栈指针的值

    如何在 Linux Debian 和 Ubuntu 中用 C 打印堆栈指针的当前值 我尝试谷歌但没有找到结果 一个技巧是简单地将本地地址作为指针打印出来 但它不可移植 甚至无法保证有效 void print stack pointer vo
  • Bash或Python,当打印字符到终端时,如何更改固定位置的字符?

    我想知道的事情应该是非常 基本 的 但这是我脑海中很长一段时间的问题 不知道窍门在哪里 假设在一个耗时的程序中 或者bash or Python 我必须打印出运行时的进度百分比 基本上我想打印1 一段时间后 我打印2 等等 我想要 2 完全
  • 如果specfile中的某些条件不满足,如何中止rpm包的安装?

    还有一些事情Requires标签不满足 所以我写了一个脚本来验证这些东西 但是我把它们放在哪里呢 如果没有找到 那么我想退出安装 提示用户在尝试再次安装此 rpm 之前执行这些步骤 writing exit 1 in installtag
  • 健全性检查 SSH 公钥? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我已要求用户提供他们的公共 id rsa pub ssh 密钥 然后将其放入 home theiraccount ssh authorized key
  • SSL 和 Tkinter 不存在于 Python 3.5.2、Debian Linux 的源代码构建中

    我刚刚将 Python 3 5 2 下载到我的 Debian 机器上并使用以下命令构建它 configure make make test sudo make install 一切正常 但在make test输出中 它显示安装程序由于未安装
  • Linux 缓冲区溢出环境变量

    我一直在审查不同类型的缓冲区溢出 并遇到了一个我不记得为什么会发生的问题 下面的代码是我尝试执行缓冲区溢出的程序 include
  • 使用Linux虚拟鼠标驱动

    我正在尝试实施一个虚拟鼠标驱动程序根据基本 Linux 设备驱动程序书 有一个用户空间应用程序 它生成坐标以及内核模块 See 虚拟鼠标驱动程序和用户空间应用程序代码 http www embeddedlinux org cn Essent
  • 是否可以允许jenkins访问只有root或某些特定程序可以访问的文件?

    我基本上想做的是允许 jenkins 访问我的 android sdk linux 文件夹和所有子目录 我的老板不想自己更改文件夹的权限 我应该在构建过程中这样做 我见过一些在构建过程中在执行 shell 中运行一些命令的示例 是否可以在该
  • 内核如何区分线程和进程

    Linux 中的线程被称为轻量级进程 无论是进程还是线程 它们的实现都是通过task struct数据结构 1 gt 那么 从这个意义上说 内核如何区分线程和进程 2 gt 当发生上下文切换时 线程如何在上下文切换中获得更少的开销 因为在此
  • 如何预渲染多个Vue应用页面?

    我正在尝试 未成功 在使用 Vue CLI 搭建的同一项目中预渲染多个 Vue 应用程序的 HTML 由于多种原因 我不想使用 Vue Router 或 Nuxt 等 我尝试过使用预渲染 Spa 插件 https github com ch
  • 组件内调用 Mixin 的方法(Vuejs)

    我无法从组件调用 mixin 方法 出现此错误this hello is not a function 我可以打电话hello 来自 Vue 实例 但我无法在组件内调用它 有什么事吗 div div
  • 为所有图像添加前缀(递归)

    我有一个包含 5000 多张图像的文件夹 全部带有 JPG 扩展名 我想要做的就是递归地向所有图像添加 thumb 前缀 我发现了一个类似的问题 重命名文件和目录 添加前缀 https stackoverflow com questions
  • 如何在Linux中打开端口[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经安装了 Web 应用程序 该应用程序在 RHEL centOS 上的端口 8080 上运行 我只能通过命令行访问该机器 我尝试从我的
  • bash while 循环线程

    我有一个 while 循环读取来自 a 的行 hosts while read line do ip line check done lt hosts 我的问题是我可以使用某种方法来加快速度 或者一次在 10 个主机上运行检查 每个检查都在
  • 用于列出用户和组的 Python 脚本

    我正在尝试编写一个脚本 在自己的行上输出每个用户及其组 如下所示 user1 group1 user2 group1 user3 group2 user10 group6 etc 我正在为此用 python 编写一个脚本 但想知道如何做到这
  • 使用 perf 查找线程瓶颈并优化挂机时间

    对 cpu 周期进行采样perf record如果核心利用率大致恒定 则对于寻找优化候选非常有用 但对于具有并行性不同的多个阶段的代码 计算 cpu 周期将重点强调并行阶段 而低估影响挂机时间的顺序或有限并行阶段 简而言之 天真的 perf
  • 无法使用Linux服务启动Archiva 2.1.0

    我正在尝试在 Linux 上启动最近发布的 Apache Archiva v2 1 0 独立版 出于测试目的 该 zip 已解压缩在 opt archiva 2 0 文档说 http archiva apache org docs 2 1

随机推荐

  • 看京东架构师如何解决,数据库读写分离与事务纠缠的坑

    本篇文章讨论在数据库读写分离时使用事务的那些坑 1 在读写分离时会不会造成事务主从切换错误 一个线程在Serivcie时Select时选择的是从库 DynamicDataSourceHolder中ThreadLocal对应线程存储的是sla
  • SD卡学习笔记

    每个sector为512B 与IDE磁盘一样 通过读写命令读取一个多个sector 主控程序不需要关注SD具体是怎么实现读写与擦写的 每个sector可以耐受100 000次写操作 无限次读操作 每当sector被用命令erase命令擦除了
  • 三星被曝因ChatGPT泄露芯片机密!韩媒惊呼数据「原封不动」直传美国,软银已禁止员工使用...

    点击上方 AI遇见机器学习 选择 星标 公众号 第一时间获取价值内容 明敏 萧箫 发自 凹非寺 量子位 公众号 QbitAI 三星引入ChatGPT不到20天 就发生3起数据外泄事件 其中2次和半导体设备有关 1次和内部会议有关 消息一经释
  • Java 单测—static方法

    单测 static方法 静态方法的单测 静态方法的单测 方法上加注解 PrepareForTest 静态方法所在的类 class 调用测试方法前先要mock出类 Before public void setUp throws Excepti
  • 爱可生MySQL开源数据传输中间件DTLE首次技术分享

    10月27日 上海爱可生信息技术股份有限公司赞助的 3306 技术 Meetup 武汉站成功举办 爱可生技术服务总监洪斌分享了 MySQL 开源数据传输中间件架构设计实践 的主题演讲 并对爱可生10月24日最新开源项目 DTLE 相关技术细
  • Java岗面试:美国java程序员要求

    正文 在写这个文章之前 我花了点时间 自己臆想了一个电商系统 基本上算是麻雀虽小五脏俱全 我今天就用它开刀 一步步剖析 我会讲一下我们可能会接触的技术栈可能不全 但是够用 最后给个学习路线 Tip 请多欣赏一会 每个点看一下 看看什么地方是
  • cpu的架构

    明天继续搞一下cache 还有后面的 下面是cpu框架图 开始解释cpu 1 控制器 控制器又称为控制单元 Control Unit 简称CU 下面是控制器的组成 1 指令寄存器IR 是用来存放当前正在执行的的一条指令 当一条指令需要被执行
  • 单线程 JavaScript 的异步机制与经典 for 循环面试题

    从一个经典的 for 循环问题开始 for var i 1 i lt 5 i setTimeout function timer console log i i 1000 输出是 每隔1秒 输出一个6 共5次 原理 这样的输出 是由 Jav
  • 逆矩阵的性质

    矩阵的逆矩阵具有许多有用的性质 1 如果MM 1 I 则M 1M I 2 M1M2 1 M2 1M1 1 3 M 1 1 M 4 M 1 1 M 1 0 说明 M 1 表示矩阵M的逆 摘自 lt lt 计算机图形学几何工具算法详解 gt g
  • 测试工作内容(一)---需求分析

    当我们要做一个项目时 不管项目是一个大的软件 还是一个小的功能模块 我们在执行之前都要搞清楚 这个项目是做什么的 将会实现哪些功能需求 在时间点范围内需要我们做什么 做哪些工作 所追溯的就是需求 需求分析都需要做哪些事情 怎样做 包括以下四
  • JAVA注释

    单行注释 单行注释 多行注释 多行注释 文档注释 文档注释 放在类定义 方法 field 内部类之前才有效 此行前面这个星号只是为了好看 只有第一行和最后一行的 和 才有效 文档注释可以被javadoc命令抽取出api文档格式 javado
  • 木马编程-手把手带你进入木马的世界之木马编程

    一 基础知识 1 1 木马病毒 木马 Trojan 这个名字来源于古希腊传说 荷马史诗中木马计的故事 Trojan一词的本意是特洛伊的 即代指特洛伊木马 也就是木马计的故事 木马会想尽一切办法隐藏自己 主要途径有 在任务栏中隐藏自己 这是最
  • 希尔排序

    目录 一 原理 二 示例代码 三 算法分析 希尔排序又称为缩小增量排序 是直接插入排序算法的一种更高效的改进版本 希尔排序是基于插入排序的以下两点性质而提出改进方法的 插入排序在对几乎已经排好序的数据操作时 效率高 即可以达到线性排序的效率
  • WebGL加载跨域纹理的解决方法

    本人一直对WebGL很有兴趣 也试着尝试用osgjs写了个DEMO 很成功的出现了效果 可是当自己用ASP net写了个服务端 想用自己写的服务器提供的数据来用做纹理 可是怎么也不出来 还报错 跟了下代码 发现是用作纹理的Image对象的问
  • 华为 5G、阿里检测病毒算法、腾讯 AI 一分钟诊断,国内抗疫科技大阅兵!

    作者 马超 责编 王晓曼 伍杏玲 出品 CSDN ID CSDNnews 近期以来 国际风云不断变换 而在2020年初疫情肆虐期间 也成为我国科技实力的 大检阅 近期人民网官微致敬我们中国科技企业的排头兵 可以说掌握硬核科技成了全民的共识
  • Metasploit(MSF)基础超级详细版

    MSF基础学习看这一篇就够了 Metasploit 常见名词解释 MSF简介 MSF框架结构 MSF配置数据库 内网主机发现 MSF命令查询 常用命令 数据库管理命令 核心命令 模块命令 进程命令 资源脚本命令 后台数据库命令 后端凭证命令
  • 假如“唐僧团队”裁员,你会先裁掉哪一位

    相信很多人看过水煮三国 大话西游 文中去西天取经的4人被影射成一个团队 其中 唐僧是TeamLeader 性格坚韧 目的明确 讲原则 懦弱没主意 孙悟空是团队中那个创意员工 业绩突出却个性极强 屡屡得罪人 猪八戒就好比那为人圆滑 偏偏干活时
  • 【ESP系列】AT指令案例

    前言 ESP系列芯片具有高性价比的联网功能 广受大家的认可 然而 在开发过程中 有时候我们想要使用ESP系列芯片的联网功能 却又不想为此编写繁杂的联网逻辑 串口交互逻辑等等 此时 我们可以运用AT指令来实现简洁的联网控制 本文将介绍这种基于
  • linux命令之查看jvm内存使用情况

    linux命令之查看jvm内存使用情况 1 使用 ps ef grep java 查询java的进程ID 2 使用jstat命令查看堆内存的使用情况 1 垃圾回收统计 jstat gc 进程ID 参数解释 S0C 第一个幸存区的大小 S1C
  • 【vue-treeselect】数据量大的时候懒加载并且可以搜索,树懒加载+搜索

    这两天快被这个懒加载加搜索搞崩溃了 今天小有收获 后面优化了再更新 主要说一下一棵树如何懒加载和搜索 1 ref不解释了 和本次代码无关 2 normalizer格式化内容不重要 3 load options很关键 4 search cha