1.创建子组件
在文件夹中新建子组件select-tree.vue
具体代码如下所示:
<!--* 下拉树形选择 组件-->
<template>
<el-select ref="select" style="min-width: 260px" :value="value" v-model="valueName" collapse-tags :multiple="multiple" :clearable="clearable" @change="changeValue">
<!-- @clear="clearHandle" -->
<el-option :value="valueName" class="options">
<el-tree
show-checkbox
:default-expanded-keys="openTree"
id="tree-option"
ref="selectTree"
:accordion="accordion"
:data="options"
:props="props"
:node-key="props.value"
@check-change="handleCheckChange"
>
<span slot-scope="{ data }"> <i :class="[data.color != null ? 'ification_col' : '']" :style="{ 'background-color': data.color }"></i> {{ data.orgName }} </span>
</el-tree>
</el-option>
</el-select>
</template>
<script>
import { searchDirectory} from "@/api/record";
export default {
name: 'elSelectTree',
props: {
// 配置项
props: {
type: Object,
default: () => {
return {
value: 'orgid',
children: 'child',
label: 'orgName'
}
}
},
// 初始值(单选)
value: {
type: Object,
default: () => {
return {}
}
},
// 初始值(多选)
valueMultiple: {
type: Array,
default: () => {
return []
}
},
// 可清空选项
clearable: {
type: Boolean,
default: false
},
// 自动收起
accordion: {
type: Boolean,
default: false
},
// 是否支持多选
multiple: {
type: Boolean,
default: true
}
},
data () {
return {
options: [],
resultValue: [], // 传给父组件的数组对象值
valueName: [], // 输入框显示值
openTree: [] // 需要展开的id
}
},
watch: {
value () {
this.resultValue = this.valueMultiple // 初始值
this.initHandle()
}
},
mounted () {
this.getSelectTreeList()
this.resultValue = this.valueMultiple // 初始值
this.initHandle()
},
methods: {
// 获取 部门 tree
async getSelectTreeList() {
await searchDirectory().then(res=>{
this.options=res.data.obj
if (res.data.obj.length) {
// 默认展开的 id
res.data.obj.forEach((item) => {
console.log(item);
this.openTree.push(item.orgid)
if (item.child && item.child.length > 0) {
this.openTreeList(item.child)
}
})
}
})
// this.$api.dept.findDeptTree().then((res) => {
// if (res.data.length) {
// const { children } = res.data[0] || {}
// this.options = children
// // 默认展开的 id
// this.options.forEach((item) => {
// this.openTree.push(item.id)
// if (item.children && item.children.length > 0) {
// this.openTreeList(item.children)
// }
// })
// }
// })
},
// 初始化显示
initHandle () {
if (this.resultValue) {
this.resultValue.forEach((item) => this.valueName.push(item.orgName))
}
this.initScroll()
},
// 初始化滚动条
initScroll () {
this.$nextTick(() => {
let scrollWrap = document.querySelectorAll('.el-scrollbar .el-select-dropdown__wrap')[0]
let scrollBar = document.querySelectorAll('.el-scrollbar .el-scrollbar__bar')
scrollWrap.style.cssText = 'margin: 0px; max-height: none; overflow: hidden;'
scrollBar.forEach((ele) => (ele.style.width = 0))
})
},
// 从输入框中直接删除某个值时
changeValue (val) {
// 多选(同时删掉传给父组件中多余的值,再传给父组件)
this.resultValue.map((item, index) => {
let i = val.indexOf(item.orgName)
if (i === -1) {
this.resultValue.splice(index, 1)
}
})
this.$emit('getValue', this.resultValue)
},
// 勾选 /反选
handleCheckChange (data, checked, indeterminate) {
this.valueName = []
if (checked) {
// 选中
if (!data.child.length) {
this.resultValue.push(data)
}
} else {
// 取消勾选
this.resultValue.map((item, index) => {
if (data.orgName === item.orgName) {
this.resultValue.splice(index, 1)
console.log(this.resultValue,'11111111111');
}
})
}
this.resultValue.forEach((item) => {
this.valueName.push(item.orgName) // 输入框显示值
})
this.$emit('getValue', this.resultValue)
},
// 默认展开全部
openTreeList (list) {
list.forEach((item) => {
this.openTree.push(item.orgid)
if (item.child && item.child.length) {
this.openTreeList(item.child)
}
})
}
// 清除选中
// clearHandle () {
// this.valueName = []
// this.resultValue = []
// this.clearSelected()
// this.$emit('getValue', this.resultValue)
// },
// // 清空选中样式
// clearSelected () {
// let allNode = document.querySelectorAll('#tree-option .el-tree-node')
// allNode.forEach((element) => element.classList.remove('is-current'))
// }
}
}
</script>
<style lang="scss" scoped>
.el-scrollbar .el-scrollbar__view .el-select-dropdown__item {
height: auto;
max-height: 300px;
padding: 0;
overflow: hidden;
overflow-y: auto;
}
.el-select-dropdown__item.selected {
font-weight: normal;
}
ul li >>> .el-tree .el-tree-node__content {
height: auto;
padding: 0 20px;
}
.el-tree-node__label {
font-weight: normal;
}
.el-tree >>> .is-current .el-tree-node__label {
color: #409eff;
font-weight: 700;
}
.el-tree >>> .is-current .el-tree-node__children .el-tree-node__label {
color: #606266;
font-weight: normal;
}
.el-popper {
z-index: 9999;
}
.ification_col {
width: 20px;
height: 10px;
display: inline-block;
}
.el-select-dropdown__item::-webkit-scrollbar {
display: none !important;
}
.el-select {
::v-deep.el-tag__close {
display: none !important; //隐藏在下拉框多选时单个删除的按钮
}
}
</style>
2. 在父组件中引入进去
具体代码如下所示:
//html部分
<div class="app-container">出车单位:
<el-select-tree :valueMultiple="valueMultiple" @getValue="getSelectedValue"></el-select-tree>
</div>
//script部分
import elSelectTree from './components/select-tree.vue'
export default {
components: {
elSelectTree
},
data(){
return {
valueMultiple: []
}
},
methods:{
getSelectedValue (value) {
console.log('选中的结果值', value)
},
}
}
以上为本功能全部代码,具体情况需要视功能而定,欢迎讨论