150 lines
3.8 KiB
Vue

<template>
<div>
<div style="margin-bottom: 5px;" v-if="expand || checked">
<el-button v-if="expand" type="primary" size="mini" icon="el-icon-sort" plain @click="doExpand">展开/折叠</el-button>
<el-button v-if="checked" type="primary" size="mini" icon="el-icon-check" plain @click="() => { treeAllChecked = !treeAllChecked; checkedAll(searchData, treeAllChecked) }">全选/全不选</el-button>
</div>
<div style="margin-bottom: 5px;" v-if="search">
<el-input v-model="searchValue" placeholder="输入关键字进行过滤" @input="searchTree" :style="{ width: searchWidth }" />
</div>
<el-tree
v-if="refreshTree"
ref="tree"
:data="searchData"
v-bind="el"
node-key="id"
:default-expand-all="defaultExpandAll"
:default-checked-keys="checkedIds"
@check-change="checkChange"
@node-click="nodeClick"
:props="defaultProps"
:style="{ 'max-height': maxHeight ? maxHeight : '100%' }"
style="overflow: auto"
/>
</div>
</template>
<script>
export default {
name: 'MbTree',
props: {
url: {
type: String,
default: ''
},
params: {
type: Object,
default: () => {}
},
selectValues: {
type: String,
default: ''
},
maxHeight: {
type: String,
default: ''
},
el: {
type: Object,
default: () => {}
},
expand: {
type: Boolean,
default: true
},
checked: {
type: Boolean,
default: true
},
search: {
type: Boolean,
default: false
},
searchWidth: {
type: String,
default: '230px'
},
checkedIds: {
type: Array,
default: () => []
}
},
watch: {
async selectValues() {
await this.loadTreeData()
this.checkedAll(this.searchData, false)
var values = this.selectValues.split(',');
for(var i in values){
this.$refs.tree.setChecked(values[i], true, false)
}
}
},
data() {
return {
treeData: [],
searchData: [],
defaultProps: {
children: 'children',
label: 'name'
},
defaultExpandAll: true,
refreshTree: true,
treeAllChecked: false,
searchValue: ''
}
},
async created() {
await this.loadTreeData()
},
methods: {
searchTree() {
if(this.searchValue){
this.searchData = this.$treeTable.recursionSearch(['name'], this.$common.copyNew(this.treeData), this.searchValue, false)
}else{
this.searchData = this.treeData
}
},
doExpand() {
this.refreshTree = false
this.defaultExpandAll = !this.defaultExpandAll
this.$nextTick(() => this.refreshTree = true)
},
async loadTreeData() {
if(this.treeData.length == 0){
await this.$get(this.url, this.params).then((res) => {
this.treeData = res.data.list
this.searchData = this.treeData
})
}
},
getTree() {
return this.$refs.tree
},
checkChange(node) {
var selectMenus = []
var checkedNodes = this.$refs.tree.getCheckedNodes(false, true)
for (var i = 0; i < checkedNodes.length; i++) {
selectMenus.push(checkedNodes[i].id)
}
this.$emit('update:select-values', selectMenus.join(','))
this.$emit('check-change', selectMenus.join(','))
},
nodeClick(param1, param2, param3){
this.$emit('node-click', param1, param2, param3)
},
checkedAll(children, checked) {
if (this.$refs.tree) {
for (var i in children) {
var id = children[i].id
if(children[i].children && children[i].children.length > 0){
this.checkedAll(children[i].children, checked)
}
this.$refs.tree.setChecked(id, checked, true)
}
}
}
}
}
</script>