| <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> |