<template> 
 | 
  <div class="com-el-tree"> 
 | 
  
 | 
      <div class="m-title"><i class="el-icon-warning-outline"></i>角色列表</div> 
 | 
  
 | 
    <el-scrollbar style="height: 100%; width: 200px" class="el-role-tree"> 
 | 
      <el-tree 
 | 
        :data="tree" 
 | 
        @node-click="nodeClick" 
 | 
        node-key="id" 
 | 
        :default-expanded-keys="openKeys" 
 | 
        :expand-on-click-node="false" 
 | 
        style="padding: 5px 0; margin-right: 2px" 
 | 
      > 
 | 
        <template #default="{ node, data }"> 
 | 
          <div class="action-group"> 
 | 
            <div 
 | 
              class="action-text" 
 | 
              :class="{ 
 | 
                actived: data.id == selectId, 
 | 
                'node-text': data.parentId !== 0, 
 | 
              }" 
 | 
              :style="{ width: (4 - data.lv) * 18 + 150 + 'px' }" 
 | 
            > 
 | 
              <Icon 
 | 
                v-if="data.parentId !== 0" 
 | 
                :type="data.id == selectId ? 'ios-paper' : 'ios-paper-outline'" 
 | 
              /> 
 | 
              {{ data.roleName }} 
 | 
            </div> 
 | 
          </div> 
 | 
        </template> 
 | 
      </el-tree> 
 | 
    </el-scrollbar> 
 | 
  </div> 
 | 
</template> 
 | 
  
 | 
<script> 
 | 
export default { 
 | 
  props: { 
 | 
    // roles: { 
 | 
    //   type: Object, 
 | 
    //   default: () => { 
 | 
    //     return []; 
 | 
    //   } 
 | 
    // }, 
 | 
    onChange: { 
 | 
      type: Function, 
 | 
      default: (treeId) => {}, 
 | 
    }, 
 | 
  }, 
 | 
  data() { 
 | 
    return { 
 | 
      selectId: -1, 
 | 
      checked: false, 
 | 
      openKeys: [], 
 | 
      data: [], 
 | 
      tree: [], 
 | 
    }; 
 | 
  }, 
 | 
  created() { 
 | 
    this.load(); 
 | 
  }, 
 | 
  methods: { 
 | 
    load() { 
 | 
      this.http.post("/api/Sys_Role/getUserChildRoles", {}, true).then((result) => { 
 | 
        if (!result.status) return this.$message.error(result.message); 
 | 
        this.data.splice(0); 
 | 
        this.data = result.data; 
 | 
        this.data.forEach((x) => { 
 | 
          if (x.parentId == 0) { 
 | 
            x.lv = 1; 
 | 
            x.children = []; 
 | 
            this.tree.push(x); 
 | 
            this.getTree(x.id, x); 
 | 
          } 
 | 
        }); 
 | 
        this.openKeys.push(this.tree[0].id); 
 | 
        this.selectId = this.openKeys[0]; 
 | 
        //默认加载第一个树形菜单下面的数据 
 | 
  
 | 
        //this.onChange(this.selectId); 
 | 
      }); 
 | 
    }, 
 | 
    getTree(id, data) { 
 | 
      this.data.forEach((x) => { 
 | 
        if (x.parentId == id) { 
 | 
          x.lv = data.lv + 1; 
 | 
          if (!data.children) data.children = []; 
 | 
          data.children.push(x); 
 | 
          this.getTree(x.id, x); 
 | 
        } 
 | 
      }); 
 | 
    }, 
 | 
    nodeClick(node, selected) { 
 | 
      //  console.log(node); 
 | 
      this.selectId = node.id; 
 | 
      //缓存当前选中的节点 
 | 
      //  this.$store.getters.data().treeDemo1.treeId = node.id; 
 | 
      this.onChange(node); 
 | 
    }, 
 | 
  }, 
 | 
}; 
 | 
</script> 
 | 
<style lang="less" scoped> 
 | 
.com-el-tree { 
 | 
  //2020.06.03增加左侧tree固定宽度 
 | 
  width: 200px; 
 | 
  display: flex; 
 | 
  flex-direction: column; 
 | 
  height: 100%; 
 | 
  border-radius: 3px; 
 | 
  background: white; 
 | 
  .el-role-tree { 
 | 
    flex: 1; 
 | 
    // border-right: 1px solid #eee; 
 | 
  } 
 | 
  .actived { 
 | 
  } 
 | 
  .action-text { 
 | 
    font-size: 14px; 
 | 
  } 
 | 
} 
 | 
.role-list { 
 | 
  color: white; 
 | 
  line-height: 40px; 
 | 
  padding: 0 13px; 
 | 
  font-size: 16px; 
 | 
  top: 2px; 
 | 
  width: 200px; 
 | 
} 
 | 
.m-title { 
 | 
  line-height: 30px; 
 | 
  font-size: 15px; 
 | 
  background: #66b1ff0f; 
 | 
  font-weight: bold; 
 | 
  padding: 6px 16px; 
 | 
  border-bottom: 1px solid #eee; 
 | 
  i { 
 | 
    padding-right: 5px; 
 | 
  } 
 | 
} 
 | 
.com-el-tree ::v-dee(.el-tree-node) { 
 | 
  padding: 3px 0; 
 | 
} 
 | 
.com-el-tree ::v-dee(.el-scrollbar .el-scrollbar__thumb) { 
 | 
  width: 0 !important; 
 | 
} 
 | 
</style> 
 | 
<style scoped> 
 | 
  
 | 
</style> 
 |