手风琴模式

实现的效果: 其中一个节点展开时,其他节点关闭,一直保持最多只有一个节点是展开的。

需要解决的问题: element-ui 树形懒加载表格自带的节点展开时,默认只有第一次才会触发load函数,之后在重新展开节点时,并不会触发load函数。

实现原理:同一个的节点多次重复操作展开子节点时只触发一次load加载函数。当一个节点的子节点展开时,其他节点的子节点收起,同时新展开的节点都需要触发load函数

手风琴模式: 根据element-ui文档创建树形表格
row-key : 用来优化 Table 的渲染;在使用 reserve-selection 功能与显示树形数据时,该属性是必填的
lazy : 开启懒加载模式
tree-props :指定哪些行是包含子节点
load :绑定节点加载函数

<template><el-table ref="multipleTable" :data="list" row-key="id" lazy :load="load" :tree-props="{children: 'children', hasChildren: 'hasChildren'}"></el-table>
</template>
<script>import { listCategoryfrom } form  '@/api/category'export default {data() {return {listQuery: {page: 1,limit: 10},list: []}},methods: {load(tree, treeNode, resolve) {const newListQuery = JSON.parse(JSON.stringify(this.listQuery))newListQuery.cid = tree.id// 动态加载子节点数据listCategory(newListQuery).then(response => {this.$nextTick(function() {this.list.map(item => {if (item.id != tree.id) {// 使用手风琴模式 expanded 控制子节点关闭还是开启,loaded设置为false,可以使树形表格每次都能加载this.$set(this.$refs.multipleTable.store.states.treeData[item.id], 'loading', false)this.$set(this.$refs.multipleTable.store.states.treeData[item.id], 'loaded', false)this.$set(this.$refs.multipleTable.store.states.treeData[item.id], 'expanded', false)}})})resolve(response.data.data.items)})},}}
</script>

需要显示为手风琴模式,重点的代码是 this.$nextTick() 中的函数

this.$refs.multipleTable.store.states.treeData 获取所有父节点的状态

重新设置加载状态(这里是加载防止异常所以设置)
this.set(this.set(this.set(this.refs.multipleTable.store.states.treeData[item.id], ‘loading’, false)

重新设置节点未加载(手风琴重点代码,使load函数能够多次触发,解决了load不能多次触发的问题)
this.set(this.set(this.set(this.refs.multipleTable.store.states.treeData[item.id], ‘loaded’, false)

关闭已经打开的子节点 (expanded 为true 表示子节点展开, false 表示子节点关闭)
this.set(this.set(this.set(this.refs.multipleTable.store.states.treeData[item.id], ‘expanded’, false)

手风琴模式下的表格拖动排序

安装拖动插件 sortablejs
npm install sortablejs --save
在页面中引入
import Sortable from ‘sortablejs’

<template><el-table ref="multipleTable" :data="list" row-key="id" lazy :load="load" :tree-props="{children: 'children', hasChildren: 'hasChildren'}"></el-table>
</template>
<script>import Sortable from 'sortablejs'import { listCategoryfrom } form  '@/api/category'export default {data() {return {listQuery: {page: 1,limit: 10},list: [],treeDate: {children: [],display: true,expanded: false,lazy: true,level: 0,loaded: false,loading: false}}},mounted() {// 表格拖拽document.body.ondrop = function(event) {event.preventDefault();event.stopPropagation();}this.rowDrop()},methods: {load(tree, treeNode, resolve) {const newListQuery = JSON.parse(JSON.stringify(this.listQuery))newListQuery.cid = tree.id// 动态加载子节点数据listCategory(newListQuery).then(response => {this.$nextTick(function() {this.list.map(item => {if (item.id != tree.id) {// 使用手风琴模式 expanded 控制子节点关闭还是开启,loaded设置为false,可以使树形表格每次都能加载this.$set(this.$refs.multipleTable.store.states.treeData[item.id], 'loading', false)this.$set(this.$refs.multipleTable.store.states.treeData[item.id], 'loaded', false)this.$set(this.$refs.multipleTable.store.states.treeData[item.id], 'expanded', false)}})})resolve(response.data.data.items)})},rowDrop() {// 获取表格节点const tbody = document.querySelector('.el-table__body-wrapper tbody')const _this = this// 插件调用函数Sortable.create(tbody, {// 拖拽开始时onStart({oldIndex}) {_this.list.forEach(item => {// 重新设置 treeData 的值,让表格行拖动的过程方向图标不会消失(由于重新渲染表格数据,这一行看个人需求是否添加)_this.$set(_this.$refs.multipleTable.store.states.treeData, item.id, _this.treeDate)// 置空子节点数据,保证拖拽时只计算一级节点的数量,否则会造成节点拖拽无法正确计算位置。 lazyTreeNodeMap 是存放子节点的数据_this.$set(_this.$refs.multipleTable.store.states.lazyTreeNodeMap, item.id, [])})},// 拖拽结束onEnd({newIndex, oldIndex}) {// newIndex表格数据拖动后数据角标   oldIndex表格数据拖动前数据角标let from, endfrom = _this.list[oldIndex].idend = _this.list[newIndex].id// console.log(from, end)// 排序成功后重新获取数据 _this.list = [] 置空数据强制刷新数据,否则子节点数据无法更新,同时会出现bug ,使子节点出现在原来的位置// 后台排序,排序成功,重置数据paixu().then(res => {_this.list = []// 重新请求数据渲染_this.getList()})}})},}}
</script>

借鉴文章 https://blog.csdn.net/weixin_39001363/article/details/101547148

element-ui 树形表格 懒加载 手风琴模式 拖动排序相关推荐

  1. 使用 el-table 实现树形数据懒加载、点击行展开、每次只展示一条数据(大类)以及自定义表格合计值

    1. 使用 el-table 实现树形数据懒加载 实现必需条件: lazy :load="loadNode" :tree-props="{ children: 'chil ...

  2. axios vue 加载效果动画_vue+axios+element ui 实现全局loading加载示例

    实现全局loading加载 分析需求,我们只需要在请求发起的时候开始loading,响应结束的时候关闭loading,就这么简单 对不对? import axios from 'axios'; imp ...

  3. Swift - 表格图片加载优化(拖动表格时不加载,停止时只加载当前页图片)

    列表的单元格中包含有图片在开发中很常见.通常我们可以直接在tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIn ...

  4. 大数据量树形数据表格展示, 虚拟表格,el-table, umy-ui, 表格懒加载

    1. 出现的问题 要展示树形数据表格,根据当前点击的表格行去请求新的数据并展示, 基于这种情况遇到以下问题 1). 当树形表格数据层级大于五级且数据量较多时, 浏览器崩溃 2). 当数据条数展示超出5 ...

  5. element ui table组件 异步加载数据盒子位移

    使用element ui 中的 table组件时 ,异步加载数据,然后渲染上去时会出现td与th对不齐,但是重新重新进一次就有又好了,但是对于用户体验肯定是不行的. 这个时候只需要使用element ...

  6. Element UI 树形表格 TreeGrid TreeTable 实现

    最近在要使用类似easyui的TreeGrid的功能,但在Element中table没有现成的demo,查了一下,遇到这篇文章,写得非常不错的,原作者是一次性加载,但我们要求使用axios异步加载,所 ...

  7. element ui 图片加载失败_解决Element UI - el-image 图片初始化加载失败问题

    最近使用elementUI的el-image发现经常会出现加载src失败的情况,问题估计就是e-image的src路径一旦初始化加载失败的话就没有异步刷新,(这个地方需要注意过这个问题的大佬解读下源码 ...

  8. element ui 树形-懒加载-表格-多选 勾选问题

    element ui树形表格如下: 它的数据格式为:使用children字段来存放子级数据 tableData: [{id: 1,date: "2016-05-02",name: ...

  9. SAP Commerce Cloud (电商云) UI 的懒加载功能

    最近工作中处理了 SAP Commerce Cloud (电商云) UI 的一个懒加载 (Lazy Load) 功能的问题,这里把自己学到的东西做个记录. UI 懒加载,有时又称惰性加载,延迟加载,是 ...

最新文章

  1. SCOM2012部署系列之七:推送Windows监控代理
  2. python3.7 6如何安装-redhat7.6 安装Python 3
  3. 扬州大学广陵学院计算机网络试卷,扬州大学广陵学院控制工程考试样卷B.doc
  4. 小程序中神秘的用户数据
  5. 太沉重了:中国获全球“人道主义摄影奖”的照片!组图
  6. Music 环形界面的算法记录
  7. 折线分割平面(递推dp)
  8. 让“施工进度计划”真正产生价值——不是为了做计划而计划
  9. 仿QQ音乐(别人的代码)
  10. 流式上传文件到服务器磁盘,通过HTTP将数据从浏览器流式传输到服务器的方法...
  11. vb计算机二级考试题库,国家计算机二级考试题库 VB上机试题第12套
  12. 云服务平台重构点 @Arthur @Gyb
  13. MacBook不断重启的 5 个原因以及如何解决此问题
  14. win10底部任务栏无响应 解决办法
  15. CHCR让iOS布局更婀娜
  16. 点云配准论文阅读笔记--(4PCS)4-Points Congruent Sets for Robust Pairwise Surface Registration
  17. SpringSecurity从入门到精通
  18. go语言爬取新版正方教务系统数据
  19. 北京 Visual Studio 2010 /*CODING完美世界*/
  20. 圆的FFT分析的算法

热门文章

  1. Celery从入门到出家
  2. 浅析能耗管理系统在企业中的应用
  3. 计算机网络技术色盲可以报吗,高考体检出色盲报考会受限 这里告诉你
  4. vue项目内存溢出,JavaScript heap out of memory
  5. 倍福TwinCAT(贝福Beckhoff)基础教程6.1 TwinCAT如何与高级语言通讯
  6. 工商银行软件测试面试流程,中国工商银行测试工程师笔试题.doc
  7. Java基础+流程控制+方法+数组【笔记含代码】
  8. Word目录自动生成,不使用word默认样式的,且指定从某页开始为第一页
  9. 新版标准日本语初级_第一课
  10. flink基础与flink培训——出租车乘车项目