基于Element的組件改造的樹形選擇器(樹形下拉框)
前言:由于做項(xiàng)目需要一個(gè)樹形選擇器,項(xiàng)目用的也是element-ui框架,然而它自帶的選擇器組件沒(méi)有樹形選項(xiàng),又不想引入其他的框架組件,于是自己利用el-select和el-tree改造了一個(gè),感覺(jué)還挺好用的,就封裝成了一個(gè)組件,如下圖:
element-ui的el-select組件的選項(xiàng)只能是列表形式:

改造后的樹形選擇器:

簡(jiǎn)介:此樹形選擇器組件是基于elment-ui框架的el-select和el-tree組件的基礎(chǔ)上改造的,其解決了原el-select組件的選項(xiàng)列表不能是樹形的問(wèn)題,集合了前兩個(gè)組件的屬性和方法封裝成了一個(gè)組件,引入即可使用。其實(shí)現(xiàn)了樹形列表、默認(rèn)展開、默認(rèn)選中、清空選值等功能,基本上可以滿足大部分選擇器的使用需求。
主要代碼
組合el-select和el-tree組件:
<template>
<el-select :value="valueTitle" :clearable="clearable" @clear="clearHandle">
<el-option :value="valueTitle" :label="valueTitle">
<el-tree id="tree-option"
ref="selectTree"
:accordion="accordion"
:data="options"
:props="props"
:node-key="props.value"
:default-expanded-keys="defaultExpandedKey"
@node-click="handleNodeClick">
</el-tree>
</el-option>
</el-select>
</template>
封裝組件:
<script>
export default {
name: "el-tree-select",
props:{
/* 配置項(xiàng) */
props:{
type: Object,
default:()=>{
return {
value:'id', // ID字段名
label: 'title', // 顯示名稱
children: 'children' // 子級(jí)字段名
}
}
},
/* 選項(xiàng)列表數(shù)據(jù)(樹形結(jié)構(gòu)的對(duì)象數(shù)組) */
options:{
type: Array,
default: ()=>{ return [] }
},
/* 初始值 */
value:{
type: Number,
default: ()=>{ return null }
},
/* 可清空選項(xiàng) */
clearable:{
type:Boolean,
default:()=>{ return true }
},
/* 自動(dòng)收起 */
accordion:{
type:Boolean,
default:()=>{ return false }
},
},
data() {
return {
valueId:this.value, // 初始值
valueTitle:'',
defaultExpandedKey:[]
}
},
mounted(){
this.initHandle()
},
methods: {
// 初始化值
initHandle(){
if(this.valueId){
this.valueTitle = this.$refs.selectTree.getNode(this.valueId).data[this.props.label] // 初始化顯示
this.$refs.selectTree.setCurrentKey(this.valueId) // 設(shè)置默認(rèn)選中
this.defaultExpandedKey = [this.valueId] // 設(shè)置默認(rèn)展開
}
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)
})
},
// 切換選項(xiàng)
handleNodeClick(node){
this.valueTitle = node[this.props.label]
this.valueId = node[this.props.value]
this.$emit('getValue',this.valueId)
this.defaultExpandedKey = []
},
// 清除選中
clearHandle(){
this.valueTitle = ''
this.valueId = null
this.defaultExpandedKey = []
this.clearSelected()
this.$emit('getValue',null)
},
/* 清空選中樣式 */
clearSelected(){
let allNode = document.querySelectorAll('#tree-option .el-tree-node')
allNode.forEach((element)=>element.classList.remove('is-current'))
}
},
watch: {
value(){
this.valueId = this.value
this.initHandle()
}
},
};
</script>
css樣式:
<style scoped>
.el-scrollbar .el-scrollbar__view .el-select-dropdown__item{
height: auto;
max-height: 274px;
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;
}
</style>
注意:此樹形選擇器要求的值(options)必須是樹形對(duì)象數(shù)組,如你的值是扁平數(shù)據(jù),需轉(zhuǎn)換成樹形數(shù)據(jù)??蓞⒖?a target="_blank" href="http://www.dhdzp.com/article/181502.htm">js實(shí)現(xiàn)無(wú)限層級(jí)樹形數(shù)據(jù)結(jié)構(gòu)(創(chuàng)新算法)
到此這篇關(guān)于基于Element的組件改造的樹形選擇器(樹形下拉框)的文章就介紹到這了,更多相關(guān)Element 樹形選擇器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解element-ui日期時(shí)間選擇器的日期格式化問(wèn)題
- 詳解關(guān)于element級(jí)聯(lián)選擇器數(shù)據(jù)回顯問(wèn)題
- element-ui 時(shí)間選擇器限制范圍的實(shí)現(xiàn)(隨動(dòng))
- Element UI框架中巧用樹選擇器的實(shí)現(xiàn)
- vue2.0 element-ui中el-select選擇器無(wú)法顯示選中的內(nèi)容(解決方法)
- Vue Element 分組+多選+可搜索Select選擇器實(shí)現(xiàn)示例
- jQuery中元素選擇器(element)簡(jiǎn)單用法示例
- jQuery選擇器源碼解讀(七):elementMatcher函數(shù)
- jQuery中element選擇器用法實(shí)例
- jQuery 屬性選擇器element[herf*=''value'']使用示例
相關(guān)文章
vue 路由頁(yè)面之間實(shí)現(xiàn)用手指進(jìn)行滑動(dòng)的方法
下面小編就為大家分享一篇vue 路由頁(yè)面之間實(shí)現(xiàn)用手指進(jìn)行滑動(dòng)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨跟隨小編過(guò)來(lái)看看吧2018-02-02
vue父組件向子組件傳遞多個(gè)數(shù)據(jù)的實(shí)例
下面小編就為大家分享一篇vue父組件向子組件傳遞多個(gè)數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
vue 使用 canvas 實(shí)現(xiàn)手寫電子簽名
這篇文章主要介紹了vue 使用 canvas 實(shí)現(xiàn)手寫電子簽名功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
vue-cli3使用 DllPlugin 實(shí)現(xiàn)預(yù)編譯提升構(gòu)建速度
這篇文章主要介紹了vue-cli3使用 DllPlugin 實(shí)現(xiàn)預(yù)編譯提升構(gòu)建速度 ,需要的朋友可以參考下2019-04-04
Vue+Echart實(shí)現(xiàn)利用率表盤效果的示例代碼
這篇文章主要為大家詳細(xì)介紹了Vue如何利用Echart實(shí)現(xiàn)利用率表盤的效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2023-04-04
vue開發(fā)設(shè)計(jì)分支切換與cleanup實(shí)例詳解
這篇文章主要為大家介紹了vue開發(fā)設(shè)計(jì)分支切換與cleanup實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
vue+elementui實(shí)現(xiàn)動(dòng)態(tài)添加行/可編輯的table
這篇文章主要為大家詳細(xì)介紹了vue+elementui實(shí)現(xiàn)動(dòng)態(tài)添加行/可編輯的table,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07

