| | |
| | | <template> |
| | | <div class="h-tree-wrapper"> |
| | | <div class="h-tree"> |
| | | <div class="tree-folder" |
| | | v-for="(item, key) in data" :key="key" |
| | | :class="{'folder-open': item.open}"> |
| | | <div class="tree-folder-header" @click="open(key)"> |
| | | <span class="mrr16 md-add">+</span> |
| | | <span class="mrr16 md-del">-</span> |
| | | <a href="javascript:;">{{item.txt}}</a> |
| | | </div> |
| | | <div class="tree-folder-content"> |
| | | <div class="tree-file" |
| | | v-for="(children,ckey) in item.childrens" :key="ckey"> |
| | | <div class="tree-file-content"> |
| | | <span class="mrr16">-</span><a href="javascript:;">{{children.txt}}</a> |
| | | <divider-card |
| | | v-for="(item, key) in tree" :key="key" |
| | | :title="item.title" |
| | | :maxHeight="maxHeight"> |
| | | <div class="h-tree" style="margin-left: 32px;"> |
| | | <div class="tree-folder" :class="{'folder-open': item.open}"> |
| | | <div class="tree-folder-header" @click="open(key)"> |
| | | <span class="mrr16 md-add">+</span> |
| | | <span class="mrr16 md-del">-</span> |
| | | <a href="javascript:;">{{item.txt}}</a> |
| | | </div> |
| | | <div class="tree-folder-content"> |
| | | <div class="tree-file" |
| | | v-for="(children,ckey) in item.childrens" :key="ckey"> |
| | | <div class="tree-file-content" @click="handleClick(key, ckey)"> |
| | | <span class="mrr16">-</span> |
| | | <a href="javascript:;" |
| | | :class="{'file-active':children.active}">{{children.txt}}</a> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </divider-card> |
| | | </div> |
| | | </template> |
| | | <script> |
| | | import DividerCard from '../components/DividerCard'; |
| | | import $ from 'jquery'; |
| | | export default { |
| | | components: { |
| | | DividerCard |
| | | }, |
| | | props:{ |
| | | data: { |
| | | type: Array, |
| | | required: true |
| | | }, |
| | | maxHeight: { |
| | | type: String, |
| | | default: '300px' |
| | | }, |
| | | exclude: { |
| | | type: [Number, Boolean], |
| | | default: true |
| | | } |
| | | }, |
| | | data() { |
| | | return {} |
| | | return { |
| | | tree: [] |
| | | } |
| | | }, |
| | | watch:{ |
| | | data: { |
| | | handler: function(obj) { |
| | | this.setTree(); |
| | | }, |
| | | deep: true |
| | | } |
| | | }, |
| | | filters: { |
| | | typeFilter: function(childrens) { |
| | |
| | | } |
| | | }, |
| | | methods: { |
| | | init: function(key) { |
| | | var tree = this.tree; |
| | | for(var i=0; i<tree.length; i++) { |
| | | var _tree = tree[i]; |
| | | if(key == i) { |
| | | continue; |
| | | } |
| | | _tree.open = false; |
| | | } |
| | | }, |
| | | initSub: function() { |
| | | var tree = this.tree; |
| | | for(var i=0; i<tree.length; i++) { |
| | | var _tree = tree[i]; |
| | | var childrens = _tree.childrens; |
| | | for(var k=0; k<childrens.length; k++) { |
| | | var children = childrens[k]; |
| | | children.active = false; |
| | | } |
| | | } |
| | | }, |
| | | open: function(key) { |
| | | var open = this.data[key].open; |
| | | this.data[key].open = open?false:true; |
| | | if(this.exclude) { |
| | | this.init(key); |
| | | } |
| | | var open = this.tree[key].open; |
| | | this.tree[key].open = open?false:true; |
| | | }, |
| | | handleClick: function(key, ckey) { |
| | | this.initSub(); |
| | | var childrens = this.tree[key].childrens; |
| | | var file = childrens[ckey]; |
| | | file.active = true; |
| | | // onsole.log(file); |
| | | this.$emit('fileClick', file); |
| | | }, |
| | | setTree: function() { // 对树的数据进行处理 |
| | | var data = $.extend(true, [], this.data); |
| | | for(var i=0; i<data.length; i++) { |
| | | var _data = data[i]; |
| | | // 设置是否展开 |
| | | if(typeof(_data.open) == 'undefined') { |
| | | _data.open = false; |
| | | } |
| | | var childrens = _data.childrens; |
| | | // 遍历子属性添加active属性 |
| | | for(var k=0; k<childrens.length; k++) { |
| | | var children = childrens[k]; |
| | | // 设置是否展开 |
| | | if(typeof(children.active) == 'undefined') { |
| | | children.active = false; |
| | | } |
| | | } |
| | | |
| | | } |
| | | this.tree = data; |
| | | } |
| | | }, |
| | | computed: { |
| | | getType: function() { |
| | | |
| | | } |
| | | mounted: function() { |
| | | this.setTree(); |
| | | } |
| | | } |
| | | </script> |
| | |
| | | .tree-folder.folder-open .tree-folder-content { |
| | | display: block; |
| | | } |
| | | .tree-file-content a { |
| | | display: inline-block; |
| | | padding: 2px 8px; |
| | | } |
| | | .file-active { |
| | | background-color: #B4C7E7; |
| | | } |
| | | </style> |