vue 下拉+tree

組件:SelectTree

<template>

? <el-select :value="valueTitle" :clearable="clearable" @clear="clearHandle">

? ? <el-input

? ? ? class="selectInput"

? ? ? :placeholder="placeholder"

? ? ? v-model="filterText">

? ? </el-input>

? ? <el-option :value="valueTitle" :label="valueTitle" class="options">

? ? ? <el-tree? id="tree-option"

? ? ? ? ref="selectTree"

? ? ? ? :accordion="accordion"

? ? ? ? :data="options"

? ? ? ? :props="props"

? ? ? ? :node-key="props.value"? ?

? ? ? ? :default-expanded-keys="defaultExpandedKey"

? ? ? ? :filter-node-method="filterNode"

? ? ? ? @node-click="handleNodeClick">

? ? ? </el-tree>

? ? </el-option>

? </el-select>

</template>

<script>

export default {

? name: "el-tree-select",

? props:{

? ? /* 配置項 */

? ? props:{

? ? ? type: Object,

? ? ? default:()=>{

? ? ? ? return {

? ? ? ? ? value:'id',? ? ? ? ? ? // ID字段名

? ? ? ? ? label: 'title',? ? ? ? // 顯示名稱

? ? ? ? ? children: 'children'? ? // 子級字段名

? ? ? ? }

? ? ? }

? ? },

? ? /* 選項列表數(shù)據(jù)(樹形結(jié)構(gòu)的對象數(shù)組) */

? ? options:{

? ? ? type: Array,? ? ?

? ? ? default: ()=>{ return [] }

? ? },

? ? /* 初始值 */

? ? value:{

? ? ? type: Number,

? ? ? default: ()=>{ return null }

? ? },

? ? /* 可清空選項 */

? ? clearable:{

? ? ? type:Boolean,

? ? ? default:()=>{ return true }

? ? },

? ? /* 自動收起 */

? ? accordion:{

? ? ? type:Boolean,

? ? ? default:()=>{ return false }

? ? },

? ? placeholder:{

? ? ? type:String,

? ? ? default:()=>{return "檢索關(guān)鍵字"}

? ? }

? },

? data() {

? ? return {

? ? ? filterText: '',

? ? ? 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.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)

? ? ? })

? ? },

? ? // 切換選項

? ? 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'))

? ? },

? ? filterNode(value, data) {

? ? ? if (!value) return true;

? ? ? return data.name.indexOf(value) !== -1;

? ? }

? },

? watch: {

? ? value(){

? ? ? this.valueId = this.value

? ? ? this.initHandle()

? ? },

? ? filterText(val) {

? ? ? this.$refs.selectTree.filter(val);

? ? }

? },

};

</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->

<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;

? }

? .selectInput{

? ? padding: 0 5px;

? ? box-sizing: border-box;

? }

</style>

調(diào)用:

<template>

? <div id="app">

? ? <h1>{{`基于Element-UI組件改造的樹形選擇器`}}:</h1>

? ? <!-- 調(diào)用樹形下拉框組件 -->

? ? <SelectTree

? ? ? :props="props"

? ? ? :options="optionData"

? ? ? :value="valueId"

? ? ? :clearable="isClearable"

? ? ? :accordion="isAccordion"

? ? ? @getValue="getValue($event)"

? ? />

? ? ID為:{{valueId}}

? </div>

</template>

<script>

import SelectTree from "./components/treeSelect.vue";

export default {

? name: "app",

? components: {

? ? SelectTree

? },

? data() {

? ? return {

? ? ? isClearable: true, // 可清空(可選)

? ? ? isAccordion: true, // 可收起(可選)

? ? ? valueId: 1, // 初始ID(可選)

? ? ? props: {

? ? ? ? // 配置項(必選)

? ? ? ? value: "id",

? ? ? ? label: "name",

? ? ? ? children: "children"

? ? ? ? // disabled:true

? ? ? },

? ? ? // 選項列表(必選)

? ? ? list: [

? ? ? ? { id: 1, parentId: 0, name: "一級菜單A", rank: 1 },

? ? ? ? { id: 2, parentId: 0, name: "一級菜單B", rank: 1 },

? ? ? ? { id: 3, parentId: 0, name: "一級菜單C", rank: 1 },

? ? ? ? { id: 4, parentId: 1, name: "二級菜單A-A", rank: 2 },

? ? ? ? { id: 5, parentId: 1, name: "二級菜單A-B", rank: 2 },

? ? ? ? { id: 6, parentId: 2, name: "二級菜單B-A", rank: 2 },

? ? ? ? { id: 7, parentId: 4, name: "三級菜單A-A-A", rank: 3 },

? ? ? ? { id: 8, parentId: 7, name: "四級菜單A-A-A-A", rank: 4 },

? ? ? ? { id: 9, parentId: 0, name: "一級菜單C", rank: 1 },

? ? ? ? { id: 10, parentId: 0, name: "一級菜單end", rank: 1 }

? ? ? ],

? ? };

? },

? computed: {

? ? /* 轉(zhuǎn)樹形數(shù)據(jù) */

? ? optionData() {

? ? ? let cloneData = JSON.parse(JSON.stringify(this.list)); // 對源數(shù)據(jù)深度克隆

? ? ? return cloneData.filter(father => {

? ? ? ? // 循環(huán)所有項,并添加children屬性

? ? ? ? let branchArr = cloneData.filter(child => father.id == child.parentId); // 返回每一項的子級數(shù)組

? ? ? ? branchArr.length > 0 ? (father.children = branchArr) : ""; //給父級添加一個children屬性,并賦值

? ? ? ? return father.parentId == 0; //返回第一層

? ? ? });

? ? }

? },

? methods: {

? ? // 取值

? ? getValue(value) {

? ? ? this.valueId = value;

? ? ? console.log(this.valueId);

? ? }

? }

};

</script>

<style>

#app {

? font-family: "Avenir", Helvetica, Arial, sans-serif;

? -webkit-font-smoothing: antialiased;

? -moz-osx-font-smoothing: grayscale;

? text-align: center;

? color: #2c3e50;

? margin-top: 60px;

}

</style>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市维咸,隨后出現(xiàn)的幾起案子柬帕,更是在濱河造成了極大的恐慌假褪,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谱醇,死亡現(xiàn)場離奇詭異漱牵,居然都是意外死亡夺蛇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門布疙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人愿卸,你說我怎么就攤上這事灵临。” “怎么了趴荸?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵儒溉,是天一觀的道長。 經(jīng)常有香客問我发钝,道長顿涣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任酝豪,我火速辦了婚禮涛碑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘孵淘。我一直安慰自己蒲障,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著揉阎,像睡著了一般庄撮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毙籽,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天洞斯,我揣著相機與錄音,去河邊找鬼坑赡。 笑死烙如,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垮衷。 我是一名探鬼主播厅翔,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼搀突!你這毒婦竟也來了刀闷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤仰迁,失蹤者是張志新(化名)和其女友劉穎甸昏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徐许,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡施蜜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了雌隅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翻默。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖恰起,靈堂內(nèi)的尸體忽然破棺而出修械,到底是詐尸還是另有隱情,我是刑警寧澤检盼,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布肯污,位于F島的核電站,受9級特大地震影響吨枉,放射性物質(zhì)發(fā)生泄漏蹦渣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一貌亭、第九天 我趴在偏房一處隱蔽的房頂上張望柬唯。 院中可真熱鬧,春花似錦圃庭、人聲如沸权逗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斟薇。三九已至师坎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堪滨,已是汗流浹背胯陋。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留袱箱,地道東北人遏乔。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像发笔,于是被迫代替她去往敵國和親盟萨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345