<template>  
 | 
    <div class="tree">  
 | 
        <div v-for="(item, index) of list" :key="index" @click.stop="clickIten(item)">  
 | 
            <div class="tree_item">  
 | 
                <i class="el-icon-caret-bottom" :class="{ 'activeColor': item[defaultProps.status] }" v-show="item[defaultProps.status] && item[defaultProps.children]"></i>  
 | 
                <i class="el-icon-caret-right color" v-show="item[defaultProps.children] && !item[defaultProps.status]"></i>  
 | 
                <div class="tree_item_label long-title-style" :title="item[defaultProps.name]" :class="{ 'activeColor': item[defaultProps.status] && !item[defaultProps.children] }">{{ item[defaultProps.name] }}</div>  
 | 
            </div>  
 | 
            <div class="tree_childern" v-show="item[defaultProps.status]">  
 | 
                <tree  
 | 
                  :list="item[defaultProps.children]"  
 | 
                  :defaultProps="defaultProps"  
 | 
                  @callback="callback"  
 | 
                />  
 | 
                 <!-- @callback="callback" -->  
 | 
            </div>  
 | 
        </div>  
 | 
    </div>  
 | 
</template>  
 | 
  
 | 
<script>  
 | 
// import Bus from '@/utils/eventBus'  
 | 
export default {  
 | 
  name: 'tree',  
 | 
  props: {  
 | 
    list: {  
 | 
      type: Array,  
 | 
      required: false,  
 | 
      default: () => []  
 | 
    },  
 | 
    defaultProps: {  
 | 
      type: Object,  
 | 
      require: false,  
 | 
      default: () => {  
 | 
        return {  
 | 
          name: 'name',  
 | 
          status: 'status',  
 | 
          children: 'children',  
 | 
          id: 'id'  
 | 
        }  
 | 
      }  
 | 
    }  
 | 
  },  
 | 
  data() {  
 | 
    return {  
 | 
      tempItem: {  
 | 
        id: null,  
 | 
        name: null  
 | 
      }  
 | 
    }  
 | 
  },  
 | 
  methods: {  
 | 
    // 点击当前项  
 | 
    clickIten (item) {  
 | 
      item[this.defaultProps.status] = !item[this.defaultProps.status]  
 | 
      this.list.forEach(subItem => {  
 | 
        if ((subItem[this.defaultProps.id] !== item[this.defaultProps.id] && subItem[this.defaultProps.status]) || (this.list.length === 1 && subItem[this.defaultProps.status] === false)) {  
 | 
          subItem[this.defaultProps.status] = false  
 | 
          if (subItem[this.defaultProps.children]) {  
 | 
            this.recursion(subItem[this.defaultProps.children])  
 | 
          }  
 | 
        }  
 | 
      })  
 | 
      if (this.tempItem['id'] === item[this.defaultProps.id]) {  
 | 
        this.tempItem = {  
 | 
          id: null,  
 | 
          name: null  
 | 
        }  
 | 
      } else {  
 | 
        this.tempItem.id = item[this.defaultProps.id]  
 | 
        this.tempItem.name = item[this.defaultProps.name]  
 | 
      }  
 | 
      
 | 
      this.$emit('callback', this.tempItem, item)  
 | 
    },  
 | 
    // 递归方法  
 | 
    recursion (children) {  
 | 
      children.forEach(item => {  
 | 
        item[this.defaultProps.status] = false  
 | 
        if (item[this.defaultProps.children]) {  
 | 
          this.recursion(item[this.defaultProps.children])  
 | 
        }  
 | 
      })  
 | 
    },  
 | 
    callback (data, item) {  
 | 
      if (this.tempItem.id === data.id) {  
 | 
        this.tempItem = {}  
 | 
      } else {  
 | 
        this.tempItem.id = data.id  
 | 
        this.tempItem.name = data.name  
 | 
      }  
 | 
      this.$emit('callback', this.tempItem, item)  
 | 
    }  
 | 
  }  
 | 
}  
 | 
</script>  
 | 
  
 | 
<style lang="scss" scoped>  
 | 
.tree {  
 | 
    /*width: 100%;*/  
 | 
    /*height: auto;*/  
 | 
    /*border-radius: 5px;*/  
 | 
    /*overflow: hidden;*/  
 | 
    /*border: 1px solid #eeeeee;*/  
 | 
    /*box-sizing: border-box;*/  
 | 
    .tree_childern {  
 | 
        margin-left: 20px;  
 | 
    }  
 | 
    .activeItem {  
 | 
        background: #F4F7FC;  
 | 
    }  
 | 
    .tree_item {  
 | 
        display: flex;  
 | 
        align-items: center;  
 | 
        height: 48px;  
 | 
        cursor: pointer;  
 | 
        padding-left: 10px;  
 | 
        .tree_item_label {  
 | 
            font-size: 14px;  
 | 
            font-weight: 400;  
 | 
            color: #333333;  
 | 
            white-space: nowrap;  
 | 
        }  
 | 
        i {  
 | 
            margin-right: 5px;  
 | 
        }  
 | 
        .color {  
 | 
            color: #999999 !important;  
 | 
        }  
 | 
        .activeColor {  
 | 
            color: #305ED5 !important;  
 | 
        }  
 | 
    }  
 | 
}  
 | 
</style>  
 |