vue2+elementUI實(shí)現(xiàn)下拉樹形多選框效果實(shí)例
效果如圖所示:

1.新建el-select-tree.vue組件
<!--
* 下拉樹形選擇
-->
<template>
<el-select ref="selectTree" :value="value" v-model="valueName" :multiple="multiple" :clearable="clearable"
@clear="clearHandle" @change="changeValue">
<el-option :value="valueName" class="options">
<el-tree id="tree-option" ref="selectTree" :accordion="accordion" :data="options" :props="props"
:node-key="props.value" @node-click="handleNodeClick">
<span slot-scope="{ data }">
<i :class="[data.color != null ? 'ification_col' : '']"
:style="{ 'background-color': data.color }"></i> {{ data.name }}
</span>
</el-tree>
</el-option>
</el-select>
</template>
<script>
export default {
name: "el-tree-select",
props: {
// 配置項(xiàng)
props: {
type: Object,
default: () => {
return {
value: 'id',
children: 'children',
label: 'name'
}
}
},
// 選項(xiàng)列表數(shù)據(jù)(樹形結(jié)構(gòu)的對(duì)象數(shù)組)
options: {
type: Array,
default: () => {
return []
}
},
// 初始值(單選)
value: {
type: Object,
default: () => {
return {}
}
},
// 初始值(多選)
valueMultiple: {
type: Array,
default: () => {
return []
}
},
// 可清空選項(xiàng)
clearable: {
type: Boolean,
default: true
},
// 自動(dòng)收起
accordion: {
type: Boolean,
default: false
},
// 是否多選
multiple: {
type: Boolean,
default: false
}
},
data() {
return {
resultValue: [], // 傳給父組件的數(shù)組對(duì)象值
valueName: this.multiple ? [] : '' // 輸入框顯示值
}
},
watch: {
value() {
this.resultValue = this.multiple ? this.valueMultiple : this.value; // 初始值
this.initHandle()
}
},
mounted() {
this.resultValue = this.multiple ? this.valueMultiple : this.value; // 初始值
this.initHandle();
},
methods: {
// 初始化顯示
initHandle() {
if (this.resultValue) {
if (this.multiple) {
// 多選
this.resultValue.forEach(item => this.valueName.push(item.name));
} else {
// 單選
this.valueName = this.resultValue.name;
}
}
this.initScroll()
},
// 初始化滾動(dòng)條
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)
})
},
// 切換選項(xiàng)
handleNodeClick(node) {
// 設(shè)置點(diǎn)擊葉子節(jié)點(diǎn)后被選中 可以更改為點(diǎn)擊父節(jié)點(diǎn)也生效
if (node.children == null || node.children == undefined) {
if (this.multiple) {
// 多選(判重后添加)
let num = 0;
this.valueName.forEach(item => {
item == node[this.props.label] ? num++ : num;
})
if (num == 0) {
this.valueName.push(node[this.props.label]); // 輸入框顯示值
this.resultValue.push(node);
}
} else {
// 單選
this.$refs.selectTree.blur();
this.valueName = node[this.props.label];
this.resultValue = node;
}
this.$emit('getValue', this.resultValue);
}
},
// 從輸入框中直接刪除某個(gè)值時(shí)
changeValue(val) {
if (this.multiple) {
// 多選(同時(shí)刪掉傳給父組件中多余的值,再傳給父組件)
this.resultValue.map((item, index) => {
let i = val.indexOf(item.name)
if (i == -1) {
this.resultValue.splice(index, 1)
}
})
this.$emit('getValue', this.resultValue);
} else {
// 單選
this.$emit('getValue', val);
}
},
// 清除選中
clearHandle() {
this.valueName = this.multiple ? [] : ''
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 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;
}
</style>2.頁(yè)面引入組件使用
<template>
<div class="selectTree">
<label>請(qǐng)選擇:</label>
<!-- 單選 + 默認(rèn)值 -->
<!-- <el-select-tree :options="options" :value="value" @getValue="getSelectedValue"></el-select-tree> -->
<!-- 多選 + 默認(rèn)值 -->
<el-select-tree :options="options" :multiple="multiple" :valueMultiple="valueMultiple"
@getValue="getSelectedValue"></el-select-tree>
</div>
</template>
<script>
import elSelectTree from '../components/el-select-tree.vue'
export default {
components: {
elSelectTree
},
data() {
return {
// 開啟/關(guān) 多選/單選
multiple: true,
value: {
id: 3,
name: '張三'
},
valueMultiple: [
{
id: 3,
name: '張三'
}, {
id: 4,
name: '李四'
}
],
options: [
{
id: 1,
name: '一組',
children: [{
id: 2,
name: '第一隊(duì)',
children: [{
id: 3,
name: '小張'
}, {
id: 4,
name: '小劉'
}]
}]
},
{
id: 5,
name: '二組',
children: [{
id: 6,
name: '小馬'
}, {
id: 7,
name: '小麗'
}]
},
{
id: 8,
name: '三組',
children: [{
id: 9,
name: '小韓'
}, {
id: 10,
name: '小錢'
}]
}
]
}
},
created() {
},
methods: {
// 組件傳出來的選中結(jié)果
getSelectedValue(value) {
console.log('選中的結(jié)果值', value)
}
}
}
</script>
<style lang="scss"></style>總結(jié)
到此這篇關(guān)于vue2+elementUI實(shí)現(xiàn)下拉樹形多選框效果的文章就介紹到這了,更多相關(guān)vue2+elementUI下拉樹形多選框內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue2+elementui的el-table固定列會(huì)遮住橫向滾動(dòng)條及錯(cuò)位問題解決方案
- vue2和elementUI?實(shí)現(xiàn)落日余暉登錄頁(yè)和滑塊校驗(yàn)功能
- vue2+elementUI的el-tree的選中、高亮、定位功能的實(shí)現(xiàn)
- vue2+elementui進(jìn)行hover提示的使用
- 解決vue2中使用elementUi打包報(bào)錯(cuò)的問題
- VUE2.0+ElementUI2.0表格el-table實(shí)現(xiàn)表頭擴(kuò)展el-tooltip
- vue2 elementui if導(dǎo)致的rules判斷失效的解決方法
相關(guān)文章
vue多頁(yè)面項(xiàng)目中路由使用history模式的方法
這篇文章主要介紹了vue多頁(yè)面項(xiàng)目中路由如何使用history模式,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
利用Vue2.x開發(fā)實(shí)現(xiàn)JSON樹的方法
這篇文章主要給大家介紹了關(guān)于利用Vue2.x開發(fā)實(shí)現(xiàn)JSON樹的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
關(guān)于vue組件的更新機(jī)制?resize()?callResize()
這篇文章主要介紹了關(guān)于vue組件的更新機(jī)制?resize()?callResize(),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
vue使用better-scroll實(shí)現(xiàn)下拉刷新、上拉加載
這篇文章主要為大家詳細(xì)介紹了vue使用better-scroll實(shí)現(xiàn)下拉刷新、上拉加載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
Vue?中的?computed?和?watch?的區(qū)別詳解
這篇文章主要介紹了Vue中的computed和watch的區(qū)別詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
Vue axios 中提交表單數(shù)據(jù)(含上傳文件)
本篇文章主要介紹了Vue axios 中提交表單數(shù)據(jù)(含上傳文件),具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07
vue實(shí)現(xiàn)圖片轉(zhuǎn)pdf的示例代碼
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)圖片轉(zhuǎn)pdf的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以跟隨小編一起了解一下2023-08-08
vue項(xiàng)目打包發(fā)布到Nginx后無法訪問后端接口的解決辦法
這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目打包發(fā)布到Nginx后無法訪問后端接口的解決辦法,記錄一下項(xiàng)目需要注意的地方,方便以后快速使用,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04

