后端

index.vue 4.8KB

    <template> <el-table-column :prop="prop" :label="label" :width="width"> <template slot-scope="scope"> <span v-if="hasChild(scope.row)" @click.prevent="doexpanded(scope.$index,scope.row)" > <span :style="{paddingLeft : paddingLeft(scope.row)}"> <i :class="icon(scope.row)"></i> <i :class="floderIcon(scope.row)" style="padding-right: 7px;"></i> </span> <span>{{scope.row[prop]}}</span> </span> <span v-if="!hasChild(scope.row)"> <span :style="{paddingLeft : paddingLeft(scope.row)}"> <i :class="fileIcon" style="padding-right: 7px;padding-left:18px"></i> </span> <span>{{scope.row[prop]}}</span> </span> </template> </el-table-column> </template> <script> import util from './util' export default { name: 'el-table-tree-column', props: { prop: { type: String }, label: { type: String }, width: { type: String }, treeKey: { type: String, default: 'id' }, childNumKey: { type: String, default: 'child_num' }, parentKey: { type: String, default: 'parentId' }, levelKey: { type: String, default: 'depth' }, childKey: { type: String, default: 'children' }, fileIcon: { type: String, default: 'el-icon-file' }, folderIcon: { type: String, default: 'el-icon-folder' }, remote: { type: Function, default: null } }, computed: { owner () { let parent = this.$parent while (parent && !parent.tableId) { parent = parent.$parent } return parent } }, data () { return { loading: false } }, methods: { floderIcon (row) { var expanded = row.$extra && row.$extra.expanded return expanded ? this.folderIcon + '-open' : this.folderIcon }, hasChild (row) { if (row[this.childNumKey] !== undefined) { return row[this.childNumKey] > 0 || false } else if (row[this.childKey] !== undefined) { return row[this.childKey].length > 0 || false } else { return false } }, paddingLeft (row) { return parseInt(row[this.levelKey]) * 14 + 'px' }, icon (row) { if (row.$extra && row.$extra.loading === true) return 'el-icon-loading' return row.$extra && row.$extra.expanded ? 'el-icon-caret-bottom' : 'el-icon-caret-right' }, doexpanded (index, row) { var vm = this // var data = JSON.parse(JSON.stringify(this.owner.store.states._data)) var data = this.owner.store.states._data debugger if (data[index].$extra === undefined) { data[index].$extra = { expanded: true } } else { data[index].$extra.expanded = !data[index].$extra.expanded } if (data[index].$extra.expanded) { if (this.remote != null) { var hash = util.hash() data[index].$extra.expanded = false data[index].$extra.hash = hash data[index].$extra.loading = true vm.owner.store.commit('setData', data) this.remote(row, function (result) { let list = vm.owner.store.states._data let _index = util.index(hash, list) list[_index].$extra = { loading: false, expanded: (result && result.length > 0) || false } if (result && result.length > 0) { var prefix = list.slice(0, _index + 1) var i = 0 while (i < _index + 1) { list.shift() i++ } list = prefix.concat(result).concat(list) } else { list[_index][vm.childNumKey] = 0 } vm.owner.store.commit('setData', list) }) } else { var prefix = data.slice(0, index + 1) var i = 0 while (i < index + 1) { data.shift() i++ } data = prefix.concat(row[vm.childKey]).concat(data) this.owner.store.commit('setData', data) } } else { var id = row[vm.treeKey] var result = [] var removeIds = util.descendantsIds( id, data, this.parentKey, this.treeKey ) data.forEach(function (item) { if (util.indexOf(item[vm.treeKey], removeIds) === -1) { result.push(item) } }) data = result this.owner.store.commit('setData', data) } } } } </script>