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. 解决新增、删除、修改之后树节点不刷新问题。(参考文章

相关推荐
明月清风徐徐22 分钟前
Vue实训---2-路由搭建
前端·javascript·vue.js
王解31 分钟前
速度革命:esbuild如何改变前端构建游戏 (1)
前端·vite·esbuild
葡萄城技术团队39 分钟前
使用 前端技术 创建 QR 码生成器 API1
前端
DN金猿41 分钟前
Vue移动端网页(H5)预览pdf文件(pdfh5和vue-pdf)(很详细)
前端·vue.js·pdf
鸽鸽程序猿1 小时前
【前端】javaScript
开发语言·前端·javascript
秦时明月之君临天下1 小时前
React和Next.js的相关内容
前端·javascript·react.js
上官花雨1 小时前
什么是axios?怎么使用axios封装Ajax?
前端·ajax·okhttp
米奇妙妙wuu2 小时前
React中 setState 是同步的还是异步的?调和阶段 setState 干了什么?
前端·javascript·react.js
李刚大人2 小时前
react-amap海量点优化
前端·react.js·前端框架
闹闹没有闹2 小时前
socket连接封装
前端