<template>
<div class="tree-container">
<div v-if="canSearch" class="search-tree can-search">
<Input
v-model="searchValue"
placeholder="请输入关键字搜索"
/>
<img class="search-icon" src="@/assets/images/search2.png" alt="" />
</div>
<el-tree
v-if="show"
ref="tree"
:props="props"
:data="insideTreeData"
node-key="id"
class="filter-tree"
:show-checkbox="checkbox"
:check-strictly="checkStrictly"
highlight-current
:expand-on-click-node="expandOnClickNode"
:filter-node-method="filterNode"
@node-contextmenu="rightClick"
@node-expand="handeleNodeExpand"
@node-click="handleNodeClick"
:default-checked-keys="JSON.parse(defaultCheckedKeys)"
@check-change="handleCheckChange"
>
</el-tree>
</div>
</template>
<script>
export default {
name: 'Tree',
props: {
value: {
type: Array,
default() {
return []
},
},
checkStrictly: {
type: Boolean,
default: false,
},
checkbox: {
type: Boolean,
default: false,
},
defaultCheckedKeys: {
type: String,
default: '[]',
},
expandOnClickNode: {
type: Boolean,
default: false,
},
/**
* @description 是否可搜索
*/
canSearch: {
type: Boolean,
default: false,
},
props: {
type: Object,
default: () => {
return { label: 'label', isLeaf: 'leaf' }
},
},
url: {
type: String,
default: '/api/Dept',
},
// 默认是机构数据,可选菜单数据 menu
type: {
type: String,
default: 'unit',
},
},
data() {
return {
treeNode:[],
treeData:[],
insideTreeData: [],
searchValue: '',
show: true,
}
},
methods: {
// 过滤
filterNode(value, data) {
if (!value) return true
if(data.fullname){
return data.fullname.indexOf(value) !== -1
}else{
return data.fullName.indexOf(value) !== -1
}
},
handleClear(e) {
// if (e.target.value === '') this.insideTreeData = this.value
},
// 搜索
handleSearch() {
this.$emit('on-search', this.searchValue)
},
// 获取树的数据
handleTreeData() {
this.insideTreeData = this.value
},
// 右键
rightClick(event, data, node, obj) {
this.treeNode = node // 节点组件本身
this.treeData = data // 属性的数组中该节点所对应的对象、节点对应的
this.$emit('rightClick', event, data, node, obj)
},
// 选中机构
handleNodeClick(data, node) {
this.$emit('handleNodeClick', data, node)
},
// 删除树节点
delTreeNode(node){
node.parent.removeChild(node)
},
//新增树节点
addunit(data){
this.treeNode.doCreateChildren([data])
// console.log(this.treeNode,'--node---')
},
// 修改树节点
editunit(node,key,data){
// console.log(key,data.id)
this.$set(node, 'data', data)
// this.treeNode.parent.childNodes.map(res=> {
// if(res.key === key){
// res.id = data.sort
// }
// })
// // 排序得优化
// this.treeNode.parent.childNodes.sort((a,b)=>b.id-a.id)
// console.log('排序',this.treeNode.parent.childNodes)
},
// 设置值
setCheckedKeys(data) {
return this.$refs.tree.setCheckedKeys(data)
},
// 改变check
handleCheckChange(data, checked, indeterminate) {
// // 勾选的key
// var checkedKeys = this.$refs.tree.getCheckedKeys()
// // 暂选状态的母tab的key
// var halfKeys = this.$refs.tree.getHalfCheckedKeys()
// // 合并两个数组
// const save = checkedKeys.concat(halfKeys)
this.$emit('handleCheckChange', this.$refs.tree.getCheckedKeys())
},
// 展开事件
handeleNodeExpand(data, node, ele){
this.$emit('handeleNodeExpand',data, node, ele)
},
// 重新加载
reload() {
this.show = false
this.$nextTick(() => {
this.show = true
})
},
},
watch: {
searchValue(val) {
this.$refs.tree.filter(val)
},
value(val) {
this.searchValue = ''
this.handleTreeData()
},
},
mounted() {
this.handleTreeData()
this.$eventBus.$on('clearSearchValue', () => {
this.searchValue = ''
})
},
}
</script>
<style>
.el-tree>.el-tree-node{
min-100%;
display: inline-block;
}
.tree-container {
height: calc(100vh - 75px);
overflow: auto;
}
</style>
<style lang="less">
.search-tree{
border-radius: 4px;
position: relative;
margin: 10px 0;
// border: 1px solid #D8D8D8 !important;
input {
// height: 35px;
padding: 0 35px 0 10px;
// 修改光标颜色
// caret-color: #51D8DE;
&::placeholder {
color: rgba(0,0,0,0.25);
opacity: 1; /* Firefox */
}
&::-ms-input-placeholder {
color: rgba(0,0,0,0.25);
}
}
img.search-icon {
16px;
height: 16px;
cursor: pointer;
position: absolute;
right: 10px;
top: 50%;
transform: translateY(-50%);
}
}
</style>