element的Table表格组件树形数据与懒加载简单使用

目录

1. 代码实现

<template>
    <div>
        <!-- lazy 是否懒加载子节点数据 -->
        <!-- load 加载子节点数据的函数,lazy 为 true 时生效,函数第二个参数包含了节点的层级信息 -->
        <!-- :default-expand-all="defaultExpandAll" 是否默认展开所有行,当 Table 包含展开行存在或者为树形表格时有效  -->
        <!-- expand-row-keys 可以通过该属性设置 Table 目前的展开行,需要设置 row-key 属性才能使用,该属性为展开行的 keys 数组。 -->
        <!-- row-click 当某一行被点击时会触发该事件 -->
        <!-- expand-change 当用户对某一行展开或者关闭的时候会触发该事件(展开行时,回调的第二个参数为 expandedRows;树形表格时第二参数为 expanded)	 -->
        <el-table ref="tableRef" :data="deptList" row-key="deptId" :lazy="true" :load="load"
            :tree-props="{ children: 'children', hasChildren: 'existSub' }" :expand-row-keys="expandRowKeys"
            @row-click="(row, column, e) => clickRowLoad(row, column, e)" @expand-change="handleExpandChange">
            <el-table-column prop="deptName" label="名称" min-width="260" />
            <el-table-column prop="orderNum" label="排序" />
            <el-table-column label="创建时间" align="center" prop="createTime" min-width="200">
                <template slot-scope="scope">
                    <span>{{ (scope.row.createTime) }}</span>
                </template>
            </el-table-column>
            <el-table-column label="操作" align="center" fixed="right" min-width="220">
                <template slot-scope="scope">
                    <el-button size="mini" type="primary" @click.stop="clickHandle(scope.row)">查看</el-button>
                </template>
            </el-table-column>
        </el-table>

    </div>
</template>
  
<script>

export default {
    name: "TablePage3",
    data() {
        return {
            // 模拟数据1
            deptList_01: [
                {
                    "createTime": "2023-10-23 11:39:03",
                    "deptId": 2104,
                    "deptName": "部门1",
                    "parentName": null,
                    "parentId": 0,
                    "orderNum": 0,
                    "children": [],
                    "existSub": true,
                },
                {
                    "createTime": "2023-10-23 11:39:03",
                    "deptId": 2105,
                    "deptName": "部门2",
                    "parentName": null,
                    "parentId": 0,
                    "orderNum": 1,
                    "children": [],
                    "existSub": true,
                },
                {
                    "createTime": "2023-10-23 11:39:03",
                    "deptId": 2106,
                    "deptName": "部门3",
                    "parentName": null,
                    "parentId": 0,
                    "orderNum": 2,
                    "children": [],
                    "existSub": false,
                }
            ],
            // 模拟数据2
            deptList_02: [
                {
                    "createTime": "2023-10-23 11:39:03",
                    "deptId": 21041,
                    "deptName": "部门1-1",
                    "parentName": null,
                    "parentId": 2104,
                    "orderNum": 1,
                    "children": [],
                    "existSub": false,
                },
                {
                    "createTime": "2023-10-23 11:39:03",
                    "deptId": 21042,
                    "deptName": "部门1-2",
                    "parentName": null,
                    "parentId": 2104,
                    "orderNum": 1,
                    "children": [],
                    "existSub": false,
                },
            ],
            // 模拟数据3
            deptList_03: [
                {
                    "createTime": "2023-10-23 11:39:03",
                    "deptId": 21051,
                    "deptName": "部门2-1",
                    "parentName": null,
                    "parentId": 2105,
                    "orderNum": 1,
                    "children": [],
                    "existSub": true,
                },
            ],
            // 模拟数据4
            deptList_04: [
                {
                    "createTime": "2023-10-23 11:39:03",
                    "deptId": 210511,
                    "deptName": "部门2-1-1",
                    "parentName": null,
                    "parentId": 21051,
                    "orderNum": 1,
                    "children": [],
                    "existSub": false,
                },
            ],
            // 部门表格树数据
            deptList: [],
            // 重新渲染表格状态
            refreshTable: true,
            //父级的Id
            parentId: '',
            expandRowKeys: [],

        };
    },
    mounted() {
        // 列表
        this.getList()
    },
    methods: {
        /** 查询列表 懒加载 */
        getList() {
            //根据实际项目调用接口
            // lazyList(this.queryParams).then(response => {
            //     console.log(response, 'response查询列表')
            //     this.deptList = response.data
            // }) 

            // 模拟数据1
            this.deptList = this.deptList_01;
            this.deptList.forEach(item => {
                item.hasChildren = item.existSub
            })
            // 如果只是单纯的更新绑定的数据:是在重新加载时,清空对应ref下的这两个数据
            // this.$set(this.$refs["tableRef"].store.states, "lazyTreeNodeMap", {});
            // this.$set(this.$refs["tableRef"].store.states, "treeData", {});

            console.log(this.deptList, ' this.deptList')
            // ------------触发点击事件load------------------
            //一、-------默认展开了deptList的第一层所有数据的下级数据--------
            // 一、-------默认展开了deptList的第一层所有数据的下级数据(相当于自动点击了一次)--------
            this.openTreeHandle(this.deptList)

            //二、 展开所有行,(建议直接使用非懒加载,配置default-expand-all为true)

        },
        // 点击列表懒加载
        load(tree, treeNode, resolve) {
            console.log(tree, 'tree')
            // console.log(treeNode, 'treeNode')
            //根据实际项目调用接口,获取对应的下级数据
            // this.parentId = tree.deptId
            // lazyList(this.queryParams).then(res => {
            // console.log(res.data, 'res.data')
            // resolve(res.data)
            // })

            // 模拟数据2,模拟数据3, 模拟数据4
            let tempList = []
            if (tree.deptName == '部门1') {
                tempList = this.deptList_02
            } else if (tree.deptName == '部门2') {
                tempList = this.deptList_03
            } else if (tree.deptName == '部门2-1') {
                tempList = this.deptList_04
            }

            resolve(tempList)

        },

        // 一、-------根据接口得到deptList,根据实际需要获取需要展开的节点的id,也就是table绑定的row-key属性值(如deptId)--------
        openTreeHandle(deptList) {
            const deptId = deptList ? deptList.map(item => (item.deptId).toString()) : []
            // expandRowKeys 可以通过该属性设置 Table 目前的展开行,需要设置 row-key 属性才能使用,该属性为展开行的 keys 数组
            // 这个必须配置,只有配置了这个,getElementsByClassName才能获取到对应的数据els,下面click事件才会触发
            this.expandRowKeys = this.expandRowKeys.concat(deptId)
            console.log(this.expandRowKeys, ' this.expandRowKeys')
            const els = document.getElementsByClassName('el-table__expand-icon el-table__expand-icon--expanded')
            this.$nextTick(() => {
                console.log(els, 'els')
                console.log(els.length, 'els.length')
                if (els.length > 0) {
                    for (let i = 0; i < els.length; i++) {
                        els[i].click()
                    }
                }
            })
        },
        // 展开改变触发函数,只展开一行
        handleExpandChange(row, expandedRows) {
            // console.log(row, 'row')
            // console.log(expandedRows, 'expandedRows')
            if (expandedRows.length > 1) {
                this.$refs.tableRef.toggleRowExpansion(expandedRows[0])
            }
        },
        //点击整行load (能够点击一行的任意位置都可以进行伸缩)
        clickRowLoad(r, c, e) {
            if (e.currentTarget && e.currentTarget.firstElementChild.firstElementChild.firstElementChild) {
                console.log(e.currentTarget, 'e.currentTarget')
                if (e.currentTarget.firstElementChild.firstElementChild.firstElementChild.tagName == 'DIV') {
                    e.currentTarget.firstElementChild.firstElementChild.firstElementChild.click()
                } else {
                    e.currentTarget.firstElementChild.firstElementChild.firstElementChild.nextElementSibling.click()
                }
            }

        },
        clickHandle(row) {
            console.log(row, '点击')
        },
    },
};
</script>

2. 效果图

3. 解决新增、删除、修改之后树节点不刷新问题。(参考文章

相关推荐
蟾宫曲4 小时前
在 Vue3 项目中实现计时器组件的使用(Vite+Vue3+Node+npm+Element-plus,附测试代码)
前端·npm·vue3·vite·element-plus·计时器
秋雨凉人心4 小时前
简单发布一个npm包
前端·javascript·webpack·npm·node.js
liuxin334455664 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全
qq13267029404 小时前
运行Zr.Admin项目(前端)
前端·vue2·zradmin前端·zradmin vue·运行zradmin·vue2版本zradmin
LCG元5 小时前
Vue.js组件开发-使用vue-pdf显示PDF
vue.js
魏时烟5 小时前
css文字折行以及双端对齐实现方式
前端·css
哥谭居民00016 小时前
将一个组件的propName属性与父组件中的variable变量进行双向绑定的vue3(组件传值)
javascript·vue.js·typescript·npm·node.js·css3
烟波人长安吖~6 小时前
【目标跟踪+人流计数+人流热图(Web界面)】基于YOLOV11+Vue+SpringBoot+Flask+MySQL
vue.js·pytorch·spring boot·深度学习·yolo·目标跟踪
踢足球的,程序猿6 小时前
Android native+html5的混合开发
javascript
2401_882726486 小时前
低代码配置式组态软件-BY组态
前端·物联网·低代码·前端框架·编辑器·web