element-ui树形控件(tree)将父级半选状态id和选中子级id一起传给后台,回显去掉父级半选状态id

一、视图代码

 <el-collapse v-model="activeName"
                         v-loading="loading"
                         element-loading-text="正在加载..."
                         element-loading-spinner="el-icon-loading"
                         element-loading-background="rgba(0, 0, 0, 0.8)"
                         accordion
                         @change="change">
                <el-collapse-item :title="r.nameZh" :name="r.id" v-for="(r,index) in roles" :key="index">
                    <el-card class="box-card">
                        <div slot="header" class="clearfix">
                            <span>可访问的资源</span>
                            <el-button style="float: right; padding: 3px 0;color: #ff0000;" icon="el-icon-delete"
                                       type="text" @click="deleteRole(r)"></el-button>
                        </div>
                        <div>
                            <el-tree
                                    show-checkbox
                                    node-key="id"
                                    ref="tree"
                                    :key="index"
                                    :default-checked-keys="checkedKeys"
                                    :data="allmenus"
                                    :props="defaultProps"></el-tree>
                            <div style="display: flex;justify-content: flex-end">
                                <el-button @click="cancelUpdate">取消修改</el-button>
                                <el-button type="primary" @click="doUpdate(r.id,index)">确认修改</el-button>
                            </div>
                        </div>
                    </el-card>
                </el-collapse-item>
            </el-collapse>

样式图:


image.png

我这里使用了几个element的组件,Collapse 折叠面板、Card 卡片、Tree 树形控件。

虽然代码贴了这么多,但是只需要注意几个地方。


image.png

Collapse 折叠面板的chang事件

 change(rid) {
    //rid是当前角色id
                if (rid) {
                    this.initAllMenus(rid);
                }
            },
  initAllMenus(rid) {
                this.getRequest("/api/system/basic/permiss/getAllMenu").then(resp => {
                    if (resp) {
                        //allmenus  所有的菜单
                        this.allmenus = resp;
                        console.log(this.allmenus)
                        //选中的菜单数据  防止有缓存先清空在赋值
                        this.checkedKeys = [];
                        //获得当前角色拥有的菜单
                        this.initSelectedMenus(rid);
                    }
                })
            },

//根据角色id 查询所拥有的菜单
            initSelectedMenus(rid) {
                this.getRequest("/api/system/basic/permiss/mid/" + rid).then(resp => {
                    if (resp) {
                        var arr = resp;//后台返回的id组成的数组
                        console.log("后台返回的id组成的数组")
                        console.log(arr)
                        var newArr = [];
                        var item = '';
                        arr.forEach(item=>{
                           this.checked(item,this.allmenus,newArr)
                       })
                        this.checkedKeys = newArr;
                        console.log("进行处理选择的菜单")
                        console.log(this.checkedKeys)
                    }
                })
            },
//回显处理
checked(id,data,newArr){
                data.forEach(item => {
                if(item.id == id){
                    if( item.children.length == 0 ){
                        newArr.push(item.id)
                    }
                }else{
                    if( item.children.length !=0 ){
                        this.checked(id,item.children,newArr)
                    }
                }
        });
    },

//修改
 doUpdate(rid, index) {
                let tree = this.$refs.tree[index];
                let getHalfCheckedKeys =  tree.getHalfCheckedKeys();  //父级id
                let selectedKeys = tree.getCheckedKeys(false);  //全选中时会将父级id传入
                let allKey = getHalfCheckedKeys.concat(selectedKeys);
                console.log("将父级id和子级id传入")
               console.log(allKey)
                let url = '/api/system/basic/permiss/?rid=' + rid;
                allKey.forEach(key => {
                    url += '&menuIds=' + key;
                })
                this.putRequest(url).then(resp => {
                    if (resp) {
                        this.activeName = -1;
                    }
                })
            },

二、复制

上面贴了这么多,我是想让你们看的比较清楚。

  let getHalfCheckedKeys =  tree.getHalfCheckedKeys();  //父级id
  let selectedKeys = tree.getCheckedKeys(false);  //全选中时会将父级id传入
  let allKey = getHalfCheckedKeys.concat(selectedKeys);


var arr = resp;//后台返回的id组成的数组
console.log("后台返回的id组成的数组")
console.log(arr)
var newArr = [];
var item = '';
arr.forEach(item=>{
    this.checked(item,this.allmenus,newArr)
    })
this.checkedKeys = newArr;
console.log("进行处理选择的菜单")
console.log(this.checkedKeys)      
          



//回显处理
checked(id,data,newArr){
                data.forEach(item => {
                if(item.id == id){
                    if( item.children.length == 0 ){
                        newArr.push(item.id)
                    }
                }else{
                    if( item.children.length !=0 ){
                        this.checked(id,item.children,newArr)
                    }
                }
        });
    },

注意:保证this.allmenus必须有值。你们需要将this.allmenus改成你们自己变量。

image.png
image.png

1、2、3分别是所有、员工资料、人事管理的id。
7、9分别是基本资料、员工资料的id。


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

推荐阅读更多精彩内容