【vue-treeselect+vxe-table】数据量大的时候懒加载,数据回显,输入框绑值,末级节点不要前面的箭头等问题详解_treeselect显示加载中-程序员宅基地

技术标签: vue  前端  vue.js  javascript  

vue-treeselect官网,戳我
最近做了个功能,el-table可编辑表格,有一列是treeselect下拉树,接口数据900多kb,请求花了400毫秒左右,按道理说数据不算很大,但是渲染很慢,一刷新或者刚进页面,有1.89秒的卡顿,并且点击下拉树或者同行其他的el-select下拉,卡顿非常明显。

这个列表需要填写上百行数据,不做优化肯定不行的,原先是el-table+vue-treeselect,已经写成一篇文章。后来改成vxe-table和vue-treeselect,因为vxe-table功能更强大,编辑表格有虚拟列表,再记录下。

优化的思路就是懒加载,思路是:
调两次树接口,第一次什么都不传或者传0,看后端怎么要求,最重要的是拿到的是根节点。如下:
在这里插入图片描述
子节点children都为空,只有根节点的数据。第二次还是调这个接口,传父id,拿到父id下的子节点,然后每次点击都是拿自己下面的子节点,
如下:
在这里插入图片描述

思路有了,下面就是具体的实现:
在这里插入图片描述
这是官网对延迟加载的说明,也许很多人都不会去看文档,但是知道怎么回事,下次遇到了才会不慌。
实现懒加载少不了loadOptions以及children为null
下面开始贴代码:

1、:ref=“‘treeselect’ + rowIndex” 是因为此列为必填项,有校验,和懒加载无关
2、:options=“deptOptions” 就是绑树数据
3、 :normalizer=“normalizer” 把后端返的格式换成树自己的格式
4、:load-options=“loadOptions"懒加载方法
5、 @select=“node => treeHandleSelect(scope.$index, node)” 点击树节点把id和code传给后端
6、option-label插槽是显示下拉的内容,用treeselect自己的,通过node赋值及回显
7、value-label插槽是显示文本框的内容,要用el-table的scope插槽赋值及回显
8、vxe-table可编辑表格,edit-config是可编辑配置项
vxe-table官网,戳我戳我
在这里插入图片描述
9、vxe-table的header插槽控制对应列的表头,比如给表头文字前加红色的*,表示此列为必填项
10、vxe-table的default插槽是默认插槽,刚渲染的列表默认是span标签包裹变量,可编辑表格有个特点,就是你鼠标点击行的时候才会出现输入框或下拉框之类的,当你鼠标离开后就会变成纯展示的,所以会有一个动态的效果,我这里要保持一致,不要这种效果,所以默认和可编辑的时候都是一样的组件
11、vxe-table的edit插槽就是可编辑插槽,我这里插槽内的内容和默认插槽内的是一样的。
12、给列加校验,:prop=”‘tableData.’ + rowIndex + ‘.assetTypeCode’" ,即列表数组名+索引+字段名
13、要引入LOAD_CHILDREN_OPTIONS,不然会一直报找不到的错,即使你已经log打印出来了
import { LOAD_CHILDREN_OPTIONS } from ‘@riophae/vue-treeselect’
14、其他的应该没什么了,如果有问题,可以直接联系我,也许会有遗忘,欢迎互相交流

 <vxe-table
            class="vxetable"
            :align="allAlign"
            :data="costForm.tableData"
            border                    
            resizable
            :edit-config="{ trigger: 'click', mode: 'row', showIcon: false }"
          >
            <vxe-column type="seq" width="60" title="序号"></vxe-column>
            <vxe-column field="assetTypeCode" title="xx分类" width="250">
              <template slot="header">
                <span class="requiredClass">xx分类</span>
              </template>
              <template #default="{ row, rowIndex }">
                <el-form-item :prop="'tableData.' + rowIndex + '.assetTypeCode'" :rules="rules.assetTypeCode">
                  <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="请选择资产分类名称"
                    style="width: 100%"
                    :appendToBody="true"
                    :disable-branch-nodes="true"
                    :load-options="loadOptions"             
                    @select="node => treeHandleSelect(rowIndex, node)"
                  >
                    <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>
                </el-form-item>
              </template>
              <template #edit="{ row, rowIndex }">
                <!-- :load-options="loadOptions" -->
                <el-form-item :prop="'tableData.' + rowIndex + '.assetTypeCode'" :rules="rules.assetTypeCode">
                  <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="请选择资产分类名称"
                    style="width: 100%"
                    :appendToBody="true"
                    :disable-branch-nodes="true"
                    :load-options="loadOptions"
                    :disabled="showStatusBtn === '2' || showStatusBtn === '3'"
                    @open="itemopen(rowIndex)"
                    @close="itemClose(rowIndex)"
                    @select="node => treeHandleSelect(rowIndex, node)"
                  >
                    <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>
                </el-form-item>
              </template>
            </vxe-column>
    </vxe-table>          

格式化

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

初始化的时候,先调树接口,拿到根节点

// 初始化数据
    initData() {
    
     //什么都不传,拿到根节点     
      lazyTreeselect().then(res => {
          
        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)
        }      
      })     
    },

点击的时候拿到子节点,这时要用到loadOptions方法


  // 树懒加载
    loadOptions({
     action, parentNode, callback }) {
        
      if (action === LOAD_CHILDREN_OPTIONS) {
    
        //加载点击节点的子节点,parentNode.id即父节点,
        //还是调树接口,传id进去
        lazyTreeselect({
     id: parentNode.id }).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
            //后端返的接口里正常都会有个类似于isLeaf/hasLaef字段,末级为1或者true
            //如果没有,直接和后端要就行了
             if (index.hasLeaf == '1') {
    
              delete chiledModeInfo.children//为末级的时候删掉children,就不会出现末级也有小箭头可以点
            }
            arr.push(chiledModeInfo)
          }
          parentNode.children = arr
        })
        callback()
      }
    },

点击树节点的时候,把code和id都传给后端

 treeHandleSelect(index, node) {
         
      this.standTableList[index].assetTypeName = node.label
      this.standTableList[index].assetTypeName = node.name
      this.standTableList[index].assetTypeid = node.id
      this.standTableList[index].assetTypeCode = node.code
    },

选完节点并回显后,调保存接口,把数据传给后端,然后就完成了,我们调详情接口回显也是可以正常回显的,因为上面文本框的插槽绑的已经是scope.row.字段的值,相当于自己自定义的值后端已经保存了。

在写代码的过程中遇到报错,节点id和code重复的报错,是因为loadOption里还没开始写,记录下,下次遇到就不慌了

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_49668076/article/details/125804831

智能推荐

【玩转华为云】手把手教你利用ModelArts实现垃圾自动分类_华为云人工智能 垃圾分类-程序员宅基地

文章浏览阅读1.4k次。本篇推文共计2000个字,阅读时间约3分钟。华为云—华为公司倾力打造的云战略品牌,2011年成立,致力于为全球客户提供领先的公有云服务,包含弹性云服务器、云数据库、云安全等云计算服务,软件开发服务,面向企业的大数据和人工智能服务,以及场景化的解决方案。华为云用在线的方式将华为30多年在ICT基础设施领域的技术积累和产品解决方案开放给客户,致力于提供稳定可靠、安全可信、可持续创新的云服务,做智能世界的“黑土地”,推进实现“用得起、用得好、用得放心”的普惠AI。华为云作为底座,为华为全栈全场景A.._华为云人工智能 垃圾分类

Python 开发桌面应用居然如此简单_python制作桌面端-程序员宅基地

文章浏览阅读6.4k次,点赞4次,收藏86次。我们都知道 Python 可以用来开发桌面应用,一旦功能开发完成,最后打包的可执行文件体积大,并且使用 Python 开发桌面应用周期相对较长假如想快速开发一款 PC 端的桌面应用,推荐使用 Aardio + Python 搭配的方式进行开发1. Aardio介绍Aardio 是一款专注于 Windows 桌面端的软件开发,适用于快速开发一些自用的 PC端桌面工具,并且它支持与Python、JS、Golang 等主流语言进行混合编程它是一款免费的开发工具,简单易学,支持多线程,具有轻巧..._python制作桌面端

IDEA中Spring配置错误:class path resource [.xml] cannot be opened because it does not exist_class path resource [feign/requestinterceptor.clas-程序员宅基地

文章浏览阅读10w+次,点赞71次,收藏72次。如果在运行 Spring 项目时出现了类似于:class path resource [applicationContext.xml] cannot be opened because it does not exist这样的异常 意思就是没有找到你的 .xml 配置文件原因我可以肯定你一定用的是 ApplicationContext ctx = new ClassPathXmlApplicati_class path resource [feign/requestinterceptor.class] cannot be opened becaus

Activiti工作流引擎-程序员宅基地

文章浏览阅读1w次,点赞8次,收藏50次。Activiti是一个工作流引擎, activiti可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程由activiti进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。........._activiti工作流引擎

【BZOJ】【3053】The Closest M Points-程序员宅基地

文章浏览阅读76次。KD-Tree  题目大意:K维空间内,与给定点欧几里得距离最近的 m 个点。  KD树啊……还能怎样啊……然而扩展到k维其实并没多么复杂?除了我已经脑补不出建树过程……不过代码好像变化不大>_>  然而我WA了。。。为什么呢。。。我也不知道……  一开始我的Push_up是这么写的:inline void Push_up(int o){ rep(..._euclidean distance between w and the closest point to w in s v

testng生成报告ReportNG美化测试报告-程序员宅基地

文章浏览阅读184次。testng生成报告ReportNG美化测试报告testng生成报告ReportNG美化测试报告ReportNG 是一个配合TestNG运行case后自动帮你在test-output文件内生成一个相对较为美观的测试报告!ReportNG 里面Log 是不支持中文的,我改过ReportNG.jar源码,具体方法看最下面,也可以找我直接要jar!话不多说直接上环境准备:1,你需要这些架包 ..._testng reportng美化报告

随便推点

C++实现线性表的顺序存储结构_c++使用顺序存储表示方法创建线性表-程序员宅基地

文章浏览阅读2.5k次,点赞6次,收藏48次。C++线性表的顺序存储结构 线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。线性表的特点除第一个元素外,其他每一个元素有且仅有一个直接前驱。除最后一个元素外,其他每一个元素有且仅有一个直接后继。直接前驱和直接后继描..._c++使用顺序存储表示方法创建线性表

重装protobuf报错undefined symbol: _ZNK6google8protobuf7Message11GetTypeNameB5cxx11Ev-程序员宅基地

文章浏览阅读1.4w次,点赞2次,收藏7次。服务器将protobuf版本从2.6.1降级到2.5.0后,重新装回2.6.1,出现报错:protoc: symbol lookup error: /usr/lib/x86_64-linux-gnu/libprotoc.so.9: undefined symbol: _ZNK6google8protobuf7Message11GetTypeNameB5cxx11Ev搜索网上解决办法,发现并...__znk6google8protobuf7message11gettypenameb5cxx11ev

【校招VIP】java语言考点之synchronized和volatile-程序员宅基地

文章浏览阅读356次。synchronized和volatile两个关键字也是校招常考点之一。volatile可以禁止进行指令重排。synchronized可作用于一段代码或方法,既可以保证可见性,又能够保证原子性。_synchronized和volatile

互联网平台经济模式逐渐形成,许多新的创新型企业涌现出来,将会影响到社会的治理结构以及公共政策走向-程序员宅基地

文章浏览阅读461次。作者:禅与计算机程序设计艺术 1.简介在新冠病毒疫情期间,由于经济全面恢复、国内外大量人员返乡、工作日程调整等因素的影响,使得整个社会成为新冠病毒大流行的重灾区。为了减轻生产企业和消费者的不满情绪,提高社会福利水平,防止再次发生类似事件,各地都制定了诸多限制、规范、政策等方面的法律法规,但这些法律法规

ethereum/EIPs-161 State trie clearing-程序员宅基地

文章浏览阅读152次。EIP 161: State trie clearing- makes it possible to remove a large number of empty accounts that were put in the state at very low cost as a result of earlier DoS attacks. With this EIP, 'empty' accou..._eip161

2003与2007导出_导出2003-程序员宅基地

文章浏览阅读120次。using System;using System.Data;using System.Configuration;using System.Collections;using System.Data.OleDb;using System.IO;using System.Web;using System.Web.Security;using System.Web.U..._导出2003

推荐文章

热门文章

相关标签