在 ElementUI(Vue2)中,<el-checkbox>(多選框)用於多選項勾選場景,支持「單個複選框」(二選一)和「複選框組」(多選一/多選),是表單中高頻使用的組件。以下結合你的公交卡業務場景,給出完整使用指南:
一、核心作用
- 單個複選框:二值選擇(如“是否開啓服務費自動續費”“是否免審核”);
- 複選框組(
el-checkbox-group):多選項勾選(如公交卡適用人羣、適用線路、免費時段類型); - 支持半選狀態(indeterminate)、全選/反選、禁用部分選項,適配複雜多選場景。
二、基礎用法
1. 單個複選框(二值選擇)
適用於「是/否」類單選項,綁定布爾值:
<template>
<el-form-item label="是否免身份審核">
<el-checkbox
v-model="isFreeAudit"
label="免審核" <!-- 勾選時的標識(非必須,僅作描述) -->
@change="handleCheckChange"
>
開啓免身份審核(老年卡默認開啓)
</el-checkbox>
</el-form-item>
</template>
<script>
export default {
data() {
return {
isFreeAudit: true // 初始勾選
};
},
methods: {
handleCheckChange(val) {
console.log("是否免審核:", val); // true(勾選)/ false(取消)
}
}
};
</script>
2. 複選框組(多選項勾選)
適用於「多選一/多選多」場景,綁定數組(存儲勾選的 label 值),核心是 el-checkbox-group 包裹 el-checkbox:
<template>
<el-form-item label="公交卡適用人羣">
<el-checkbox-group
v-model="selectedGroups"
@change="handleGroupChange"
>
<el-checkbox label="student">學生</el-checkbox>
<el-checkbox label="elderly">老年</el-checkbox>
<el-checkbox label="ordinary">普通市民</el-checkbox>
<el-checkbox label="disabled">殘障人士</el-checkbox>
</el-checkbox-group>
</el-form-item>
</template>
<script>
export default {
data() {
return {
selectedGroups: ["elderly"] // 初始勾選“老年”
};
},
methods: {
handleGroupChange(val) {
console.log("選中的人羣:", val); // ["elderly", "student"](多選結果)
}
}
};
</script>
三、核心屬性 & 事件
1. 單個 el-checkbox 屬性
|
屬性名
|
類型
|
説明
|
|
|
布爾
|
綁定值(是否勾選)
|
|
|
任意
|
複選框標識(提交時的取值,支持字符串/數字/對象)
|
|
|
布爾
|
是否禁用(如:已下架的卡類型禁用對應選項)
|
|
|
布爾
|
是否為半選狀態(僅視覺效果,用於全選邏輯,默認:false)
|
|
|
任意
|
勾選時的真實值(替代布爾值,如:true-label="1",false-label="0")
|
|
|
任意
|
取消勾選時的真實值
|
|
|
字符串
|
原生 input 的 name 屬性(表單提交用)
|
2. el-checkbox-group 屬性
|
屬性名
|
類型
|
説明
|
|
|
數組
|
綁定值(存儲所有勾選的 |
|
|
字符串
|
尺寸( |
|
|
布爾
|
禁用整個複選框組(所有子選項都禁用)
|
3. 通用事件
|
事件名
|
觸發時機
|
回調參數
|
|
|
勾選/取消勾選時觸發
|
單個複選框:布爾值;組:勾選的label數組
|
四、業務場景實戰(貼合公交卡需求)
場景1:公交卡適用線路多選(帶禁用)
<template>
<el-form-item label="適用公交線路">
<el-checkbox-group v-model="selectedLines">
<el-checkbox
v-for="line in lineList"
:key="line.id"
:label="line.id"
:disabled="line.isDisabled"
>
{{ line.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</template>
<script>
export default {
data() {
return {
selectedLines: [1, 3], // 初始勾選1路、3路
lineList: [
{ id: 1, name: "1路(火車站-市政府)", isDisabled: false },
{ id: 2, name: "2路(高鐵站-汽車站)", isDisabled: true }, // 禁用
{ id: 3, name: "3路(公園-醫院)", isDisabled: false }
]
};
}
};
</script>
場景2:全選/反選(半選狀態)
適用於“批量選擇”場景(如全選所有線路),利用 indeterminate 實現半選視覺效果:
<template>
<el-form-item label="適用公交線路">
<!-- 全選複選框 -->
<el-checkbox
v-model="checkAll"
:indeterminate="isIndeterminate"
@change="handleCheckAllChange"
>
全選
</el-checkbox>
<!-- 線路列表 -->
<el-checkbox-group
v-model="selectedLines"
@change="handleLineChange"
style="margin-left: 20px;"
>
<el-checkbox label="1">1路</el-checkbox>
<el-checkbox label="2">2路</el-checkbox>
<el-checkbox label="3">3路</el-checkbox>
</el-checkbox-group>
</el-form-item>
</template>
<script>
export default {
data() {
return {
checkAll: false,
isIndeterminate: true, // 初始半選
selectedLines: ["1"] // 初始勾選1路
};
},
methods: {
// 全選/取消全選
handleCheckAllChange(val) {
this.selectedLines = val ? ["1", "2", "3"] : [];
this.isIndeterminate = false;
},
// 線路勾選變化,更新全選/半選狀態
handleLineChange(val) {
const len = val.length;
this.checkAll = len === 3;
this.isIndeterminate = len > 0 && len < 3;
}
}
};
</script>
場景3:勾選值為對象(自定義label)
若需勾選後獲取完整對象(而非僅ID/字符串),label 可綁定對象:
<template>
<el-checkbox-group v-model="selectedLineObjs" @change="handleObjChange">
<el-checkbox
v-for="line in lineList"
:key="line.id"
:label="line"
>
{{ line.name }}
</el-checkbox>
</el-checkbox-group>
</template>
<script>
export default {
data() {
return {
selectedLineObjs: [],
lineList: [
{ id: 1, name: "1路", price: 1 },
{ id: 2, name: "2路", price: 2 }
]
};
},
methods: {
handleObjChange(val) {
console.log("選中的線路對象:", val);
// 輸出:[{ id: 1, name: "1路", price: 1 }]
}
}
};
</script>
五、常見問題及解決
1. 回顯不生效?
原因:綁定值的類型與 label 類型不匹配(如 label="1" 是字符串,綁定值 [1] 是數字)。 解決:保證類型一致:
<!-- 正確:label和綁定值都是數字 -->
<el-checkbox label="1" /> → 綁定值:[1] ❌
<el-checkbox :label="1" /> → 綁定值:[1] ✅
2. 半選狀態不顯示?
indeterminate 僅控制視覺效果,需手動維護該狀態(如場景2中 isIndeterminate = len > 0 && len < 3),且 v-model="checkAll" 仍為 false。
3. 禁用部分選項?
單個選項禁用:給 <el-checkbox> 加 :disabled="true"; 整組禁用:給 <el-checkbox-group> 加 :disabled="true"。
4. 提交時需轉字符串?
若後端要求勾選值為逗號分隔的字符串(如 "1,3"),可在提交時轉換:
const submitData = {
...form,
selectedLines: this.selectedLines.join(",")
};
六、ElementUI vs Element Plus 差異
|
特性
|
ElementUI(Vue2)
|
Element Plus(Vue3)
|
|
半選狀態
|
|
同上(兼容)
|
|
標籤插槽
|
直接寫在標籤內(如 |
支持 |
|
對象類型 label
|
支持,但需注意引用類型匹配
|
完全支持,新增 |
|
尺寸屬性
|
|
支持單個複選框設置 |