elementui 后台管理系统遇到的问题(二) 树形控件 el-tree

elementui中树形控件的使用

一、将后台返回的数据填充到前端控件中,需要注意的几点问题

(1)、el-tree中需要绑定node-key='自定义的id名称'
(2)、在配置data中defaultProps中的属性时,要按照与后端协商的字段名称对称
(3)、重要的是要月后端协商返回字段内容:

协商返回的数据格式(举例):

children: Array(6) //与defaultProps中的children对应
menuId: 1 //与node-key对应
name: "运维管理"  //与defauktProps中的label字段相对应;
parentId: 0 //父节点id
path: "/"

二、当前端要将选中的菜单项传入后端的时候,现有的API中当选中父菜单时候所有的子菜单会checked,但是当该菜单下不是选中所有子菜单的时候,这时候主菜单不会被checked,而API中el-tree的getCheckedKeys()方法只会选中属性为checked菜单的名为 node-key对应的id的集合,这时候有三种方法

(1)、第一种方法:
1、找到项目中的\node_modules\element-ui\lib\element-ui.common.js文件;
2、搜索文件中的TreeStore.prototype.getCheckedNodes方法中的;

if (child.checked && (!leafOnly || leafOnly && child.isLeaf)) {
          checkedNodes.push(child.data);
}

3、修改成

if ((child.checked || child.indeterminate) && (!leafOnly || leafOnly && child.isLeaf)) {
          checkedNodes.push(child.data);
 }

4、重启项目

console.log(this.$refs.tree.getCheckedKeys()); //就可以拿到父节点的ID啦

(2)、第二种方法

methods: {
      getCheckedNodes() {
        var rad=''
        var ridsa = this.$refs.tree.getCheckedKeys().join(',')// 获取当前的选中的数据[数组] -id, 把数组转换成字符串
        var ridsb = this.$refs.tree.getCheckedNodes()// 获取当前的选中的数据{对象}
        ridsb.forEach(ids=>{//获取选中的所有的父级id
          rad+=','+ids.pid
        })
        rad=rad.substr(1) // 删除字符串前面的','
        var rids=rad+','+ridsa
        var arr=rids.split(',')//  把字符串转换成数组
        arr=[...new Set(arr)]; // 数组去重
        rids=arr.join(',')// 把数组转换成字符串
        console.log(rids)
      }
    }

(3)、第三种方法(推荐) 官方新出的获取半选中状态的方法

let parentArr = this.$refs.tree.getHalfCheckedKeys()   //获取半选中状态的id
let childArr = this.$refs.tree.getCheckedKeys()  //获取全选中的id
this.addRoleForm.rolePower = parentArr.concat(childArr)   //拼接在一起

API解释相关方法属性

属性说明

参数 说明 类型 可选值 默认值
data 展示数据 Array ---- ---
empty-text 内容为空的时候展示的文本 String --- ---
node-key 每个树节点用来作为唯一标识的属性,整棵树应该是唯一的 String --- ---
Props 配置选项(见props) object --- ---
render-after-expand 是否在第一次展开某个树节点后才渲染其子节点 boolean --- true
load 加载子树数据的方法,仅当lazy属性为true时生效 function(node,resolve) -- --
default-expand-all 是否默认展开所有节点 boolean --- ---
show-checkbox 节点是否可被选择 boolean --- ---

Props

参数 说明 类型 可选值 默认值
label 指定节点标签为节点对象的某个属性值 String,function(data,node) -- --
children 指定子树为节点对象的某个属性值 String --- ---
disabled 指定节点选择框是否禁用为节点对象的某个属性值 boolean,function(data,node) -- --
isLeaf 指定节点是否为叶子节点,仅在指定了 lazy 属性的情况下生效 boolean,function(data,node) -- ---

更多的方法 详情

element-ui官网

整个项目的代码结构

<template>
<div>
    <el-tree :data="data2" show-checkbox node-key="menuId" ref="tree" highlight-current :props="defaultProps" @check='slesCheck'>
    </el-tree>
</div>
</template>

<script>
export default {
    data() {
        return {
            data2: [],
            defaultProps: {
                children: 'children',
                label: 'name'
            },
        };
    },
    methods: {
        getMenu() {
            this.$axios.get('menu/queryMenuList').then(res => {
                this.data2 = res.data
                console.log(res.data)
            })
        },
        slesCheck() {
           // this.checkedIds = this.$refs.tree.getCheckedKeys();
            // var rad = ''
            // var ridsa = this.$refs.tree.getCheckedKeys().join(',') // 获取当前的选中的数据[数组] -id, 把数组转换成字符串
            // var ridsb = this.$refs.tree.getCheckedNodes() // 获取当前的选中的数据{对象}
            // ridsb.forEach(ids => { //获取选中的所有的父级id
            //     rad += ',' + ids.parentId
            // })
            // rad = rad.substr(1) // 删除字符串前面的','
            // var rids = rad + ',' + ridsa
            // this.addRoleForm.rolePower = rids.split(',') //  把字符串转换成数组
            // this.addRoleForm.rolePower = [...new Set(this.addRoleForm.rolePower)]; // 数组去重
            // // rids = arr.join(',') // 把数组转换成字符串
            // console.log(this.addRoleForm.rolePower)
            let parentArr = this.$refs.tree.getHalfCheckedKeys()
            let childArr = this.$refs.tree.getCheckedKeys()
            this.addRoleForm.rolePower = parentArr.concat(childArr)
            console.log(parentArr)
            console.log(childArr)
            console.log(this.addRoleForm.rolePower)
        },
        getMeunList() {
            // this.$axios.get('menu/queryMenuIdList?roleId=1').then(res=>
            // this.$refs.tree.setCheckedKeys( this.checkedIds); //修改前要先获取该el-tree的选中状态
            //     console.log(res)
            // })
        }
    },

    created() {
        this.getMenu()
        // this.getMeunList()
    }
}
</script>
<style>
.el-tree {
    margin-top: 60px;
    width: 200px;
}
</style>

遗留的问题!!!!后台返回的数组中既有父级菜单id又有子菜单id,但子菜单并不完整的情况下,运用setCheckedKey()方法会将该父级菜单下的所有子菜单选中,有一个属性check-strictly(在显示复选框的情况下,是否严格的遵循父子不互相关联的做法,默认为 false)但是设置后当子菜单数量很多的情况下,体验很不好,求教各路大神解惑

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335