Vue+Element 單選模式下Cascader級聯選擇器使用總結
一、單選模式下選擇任意節點
在單選模式下,只能選擇葉子節點,是因為父子節點存在關聯。官方文件中寫道:“可通過 props.checkStrictly = true
來設定父子節點取消選中關聯,從而達到選擇任意一級選項的目的。”
使用示例:
<el-cascader :props="{ checkStrictly: true }" :options="options"></el-cascader>
二、單選模式下選中節點後,關閉下拉框
在單選模式下,選中節點後,下拉框不會關閉。增加點選事件,將下拉框dropDownVisible屬性設定為false。注意:預設為click觸發子選單,在這裡要改為hover。官方文件中寫道:“通過props.expandTrigger
可以定義展開子級選單的觸發方式。”
使用示例:
// visible-change:下拉框出現/隱藏時觸發 出現則為 true 隱藏則為 false
// expand-change:當展開節點發生變化時觸發 各父級選項值組成的陣列
// change:當選中節點變化時觸發 選中節點的值
<el-cascader ref="elcascader" @visible-change="elCascaderOnlick" @expand-change="elCascaderOnlick" @change="regionHandleChange" :props="{ checkStrictly: true, expandTrigger: 'hover' }" :options="regions"></el-cascader>
methods: {
// 獲取選中的資料,進行賦值操作
regionHandleChange(arr) {
// arr是選中的陣列eg:[1, 5],但因為後臺資料庫設計暫時不支援陣列傳參,後臺只要選中的節點的值,所以我將陣列最後一個值取出來進行賦值操作
// 注意:這裡要傳的值相當於id,父子節點都是唯一的
if (arr) {
// 此方法返回的是一個元素,eg:5
this.add_host_Form.group_id = arr[arr.length - 1];
// 此方法返回的是一個陣列,eg:[5]
// this.add_host_Form.group_id = arr.slice(-1);
}
},
// 觸發click事件,關閉下拉框
elCascaderOnlick() {
let that = this;
// .el-cascader-node__label 和 .el-cascader-panel .el-radio 這是Element級聯選擇器的類,可以參考下方截圖
setTimeout(function() {
document.querySelectorAll(".el-cascader-node__label").forEach((el) => {
el.onclick = function() {
this.previousElementSibling.click();
// 選中span標籤後,關閉下拉框
that.$refs.elcascader.dropDownVisible = false;
};
});
document
.querySelectorAll(".el-cascader-panel .el-radio")
.forEach((el) => {
el.onclick = function() {
// 選中radio後,關閉下拉框
that.$refs.elcascader.dropDownVisible = false;
};
});
}, 100);
}
}
data() {
return {
add_host_Form: {
group_id: null
},
regions: [{
"label": "A-1區域",
"value": 1,
"haschild": true,
"children": [{
"label": "A-2過道",
"value": 5,
"haschild": false
}]
},
{
"label": "A-2區域",
"value": 2,
"haschild": true,
"children": [{
"label": "A-4過道",
"value": 7,
"haschild": false
}]
},
{
"label": "B-1區域",
"value": 3,
"haschild": true,
"children": [{
"label": "B-6過道",
"value": 9,
"haschild": false
},
{
"label": "B-2過道",
"value": 10,
"haschild": false
},
{
"label": "111",
"value": 16,
"haschild": false
}
]
},
{
"label": "C-1區域",
"value": 4,
"haschild": false
}
]
}
}
關於 .el-cascader-node__label 和 .el-cascader-panel .el-radio 兩個類的來源
三、 在單選模式下隱藏radio樣式,只顯示文字
在單選模式下,會出現單選按鈕樣式,雖然這樣方便讓使用者理解這裡可以進行單選操作,但不得不吐槽一下,有點影響美觀。我們可以使用元件自帶的類進行css樣式進行隱藏操作,注意style標籤不要加scoped,不然樣式就不生效了。
<style>
/* cascader 隱藏單選樣式 start */
.el-cascader-panel .el-radio {
display: none;
}
/* cascader 隱藏單選樣式 end */
</style>
在上一步程式碼的基礎上elCascaderOnlick()方法可以將radio點選事件刪去了,可以這樣簡寫:
methods: {
regionHandleChange(arr) {
if (arr) {
this.add_host_Form.group_id = arr[arr.length - 1];
}
},
elCascaderOnlick() {
let that = this;
setTimeout(function() {
document.querySelectorAll(".el-cascader-node__label").forEach((el) => {
el.onclick = function() {
this.previousElementSibling.click();
that.$refs.elcascader.dropDownVisible = false;
};
});
}, 100);
}
}
四、在單選模式下,Cascader級聯選擇器進行資料回顯
先上程式碼:
<el-cascader v-model="region_value" ref="elcascader" @visible-change="elCascaderOnlick" @expand-change="elCascaderOnlick" @change="regionHandleChange" :props="{ checkStrictly: true, expandTrigger: 'hover' }" :options="regions"></el-cascader>
在這裡回顯用於更新操作, 比新建操作多了一個v-model屬性。region_value是陣列,在data中這樣定義:
data() {
return {
region_value: [],
edit_host_form: {
group_id: null
},
regions: [...省略]
}
}
資料回顯關鍵程式碼:
// 假設後臺返回的group_id欄位有值,group_id = [1, 5]
if (res.data.data) {
// 將返回的陣列進行賦值
this.region_value = res.data.data.group_id;
// 給要提交的區域賦值,陣列最後一個資料
this.edit_host_form.group_id = this.region_value[
this.region_value.length - 1
];
}
在這裡我不得不吐槽一下我自己。。。我雖然向後臺傳的是選中的節點的值,是整型的,不過後臺進行封裝處理後,返回給我的是一個陣列,包含子父節點的值,eg:[5, 1]。你品,你細品,有沒有哪裡怪怪的?怪可愛的!呸呸呸!!!怪坑的!後臺應該返回的是“父”、“子”節點的值,應該是[1, 5]。我說呢!怎麼一級節點資料就可以正常回顯,二級以及之後就不回顯了,我還以為是返回的資料型別不對,我甚至懷疑是Element元件的Bug。我和組長說了這個情況,並演示了一下,組長就發現了問題。。。果然,我還是太年輕。然後讓後臺調整了一下資料順序,正常回顯。
五、清空Cascader級聯選擇器選中的值
增加clearable屬性
<el-cascader clearable ref="elcascader" @visible-change="elCascaderOnlick" @expand-change="elCascaderOnlick" @change="regionHandleChange" :props="{ checkStrictly: true, expandTrigger: 'hover' }" :options="regions"></el-cascader>
六、Cascader級聯選擇器僅顯示最後一級
Cascader級聯選擇器預設顯示所有父子節點的值,並以符號“/”進行分隔。官方文件中寫道:“屬性show-all-levels
定義了是否顯示完整的路徑,將其賦值為false
則僅顯示最後一級”
<el-cascader :show-all-levels="false" ref="elcascader" @visible-change="elCascaderOnlick" @expand-change="elCascaderOnlick" @change="regionHandleChange" :props="{ checkStrictly: true, expandTrigger: 'hover' }" :options="regions"></el-cascader>
附Element官方文件:https://element.eleme.cn/2.13/#/zh-CN/component/cascader
相關文章
- Element原始碼分析系列8-Cascader(級聯選擇器)原始碼
- Vue3學習(十五)之 級聯選擇元件Cascader的使用Vue元件
- 使用json和jquery級聯選擇JSONjQuery
- jQuery選擇器介紹:基本選擇器、層次選擇器、過濾選擇器、表單選擇器jQuery
- JQuery知識總結之選擇器jQuery
- CSS3新增選擇器(屬性選擇器、結構偽類選擇器、偽元素選擇器)CSSS3
- element 級聯選擇器懶載入回顯
- ElementUI級聯選擇器動態載入DemoUI
- jQuery 選擇器彙總-思維導圖-選擇器jQuery
- jQuery選擇器(下)jQuery
- 002---選擇器(標籤選擇器、類選擇器、id選擇器、偽類選擇器、萬用字元選擇器)字元
- 特徵選擇技術總結特徵
- Vue-使用ElementUI級聯選擇器懶載入省市縣資料VueUI
- CSS父級選擇器 :has()CSS
- switch選擇結構使用
- JavaScript 省市級聯選單原理JavaScript
- Element-ui 級聯選擇器元件功能擴充套件UI元件套件
- jQuery選擇器之層次選擇器jQuery
- jquery實現四級級聯下拉選單jQuery
- 初學jQuery(表單選擇器)jQuery
- v-region 2.2.2 - 基於 Vue2 的中國行政區劃選擇器(4 級聯動城市選擇器)Vue
- 選擇器
- 小程式:動態資料實現三級聯動選擇器
- 4.2.1.9 選擇 Undo 模式模式
- Selenium4自動化測試6--控制元件獲取資料--下拉框級聯選擇、checkbox選擇、時間選擇器控制元件
- 選擇結構
- jenkins 實現二級聯動選擇引數Jenkins
- Flutter 自定義輸入框Selection選單和選擇器Flutter
- CSS 選擇器前面單雙冒號:CSS
- CSS 小結筆記之選擇器CSS筆記
- CSS選擇器CSS
- jQuery選擇器jQuery
- jQuery 選擇器jQuery
- 基於 mpvue 框架的小程式選擇元件,支援單列,多列,級聯Vue框架元件
- 使用 CSS 選擇器實現對不含 title 屬性元素的選擇CSS
- 單連結串列的排序(插入,選擇,冒泡)排序
- 簡單選擇排序排序
- picker-extend 移動端級聯選擇外掛