el-select下拉選擇緩存的實現(xiàn)
項目場景:
從左側(cè)列表中選取字段填入右側(cè)下拉多選框,用戶可以對右側(cè)已選字段模擬緩存:下拉顯示時展示已選字段列表,對選項選中或取消操作時下拉框展示選中與取消的字段;下拉隱藏時,下拉框選項與右側(cè)遺留標(biāo)簽同步。
問題描述
1、查閱資料,通過給el-select綁定@change
方法可以監(jiān)聽到選中值的變換(只能獲取當(dāng)前已選中的所有值(array方式存儲),如果監(jiān)聽變化的是哪個值,需自定義變量緩存上一次存儲與當(dāng)前選中做對比)。
2、@visible-change
監(jiān)聽下拉框的顯示與隱藏,會在顯示和隱藏時都觸發(fā)。
3、初始設(shè)想:刪除輸入框內(nèi)標(biāo)簽時,直接將值返回到左側(cè)列表,下拉框選項數(shù)量更新;取消下拉框內(nèi)選擇時,輸入框內(nèi)值刪除,下拉框內(nèi)選項數(shù)量保持不變,下拉隱藏時將取消選擇的值返回左側(cè)列表。
然而實際發(fā)現(xiàn):change方法無論是輸入框選項操作還是下拉框選項操作都會觸發(fā),無法區(qū)分在哪個區(qū)域操作。
解決方案:
改變設(shè)計思路:
- 下拉框不顯示,添加與刪除項同步更新下拉選項
- 下拉框顯示時,下拉框緩存初始展示數(shù)據(jù)。在下拉框中取消選項同時數(shù)據(jù)項返回左側(cè)列表,重新選中時左側(cè)列表項刪除并移入下拉多選,隱藏時下拉框保持最新選中項存儲
關(guān)鍵代碼:
<template> <el-select :popper-append-to-body="false" class="hide_error" v-model="variables_columns" multiple @visible-change="hideOption" @change="turnOption" placeholder="請選擇" id="varia-col-select"> <el-option v-for="item in checkedList" :key="item.value" :label="item.label" :value="item.value" > </el-option> </el-select> </template>
js
export default { data(){ return { variables_columns:[], optionVisible:false,//下拉框顯示狀態(tài),false為隱藏,true為顯示 lastOperation:{data:[]},//上次選擇 startOption:false,//判斷是否第一次打開下拉框 tableData:[{id:0,name:"M1_GRAT"},{id:1,name:"M2_GRAT"},...],//模擬左側(cè)列表數(shù)據(jù) } }, methods:{ hideOption(){//隱藏時更新下拉選項 this.optionVisible = !this.optionVisible; if(!this.optionVisible){ this.checkList = this.checkList.filter( item => this.variables_columns.some(v => v==item.value) ) } }, turnOption(val){//緩存選項 if(!this.startOption)this.lastOperation.data = this.checkList.map(item => item.value); this.startOperation = true; let item = []; if(this.optionVisable){//下拉框顯示時 if(this.lastOperation.data.length>val.length){//取消選項操作 item = this.lastOperatin.data.filter(v => !val.some(v1 => v1 == v)); let backNode = {id:this.tableData.length,name:item[0]};//返回的元素 this.tableData.push(backNode); }else{//在下拉框中重新選中 let delNode = val.filter(v1 => !this.lastOperation.data.some(v2 => v1 == v2)); this.tableData = this.tableData.filter(v => v.name != delNode[0]) } } else { //下拉框不顯示,只有刪除選項時觸發(fā) item = this.checkedList.filter(v => !val.some(v1 => v1 == v.value)); this.checkList = this.checkList.filter(v => val.some(v1 => v.value)); let backNode = {id:this.tableData.length,name:item[0].value} this.tableData.push(backNode); } this.lastOperation.data = val; } }, ... }
備注:①:popper-append-to-body="false"可將下拉框dom嵌入div中,方便調(diào)整多選下拉框樣式②multiple是el-select多選必須添加的屬性
到此這篇關(guān)于el-select下拉選擇緩存的實現(xiàn)的文章就介紹到這了,更多相關(guān)el-select下拉選擇緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- element-ui中select下拉框加載大數(shù)據(jù)渲染優(yōu)化方式
- el-select 下拉框全選、多選的幾種方式組件示例詳解
- Element中el-select下拉框?qū)崿F(xiàn)選中圖標(biāo)并回顯圖標(biāo)
- 前端Vue?select下拉框使用以及監(jiān)聽事件詳解
- 在vue3中使用el-tree-select實現(xiàn)樹形下拉選擇器效果
- 如何解決element-ui中select下拉框popper超出彈框問題
- element-ui el-select下拉框el-date-picker彈出框定位問題解決方案(推薦)
- el-select選擇器組件下拉框增加自定義按鈕的實現(xiàn)
- el-select 的下拉框中新增倆自定義按鈕的操作方法
相關(guān)文章
使用Vue父子組件通信實現(xiàn)todolist的功能示例代碼
這篇文章主要給大家介紹了關(guān)于如何使用Vue父子組件通信實現(xiàn)todolist的功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04