Vue3實(shí)現(xiàn)下拉選擇框多選功能的方法詳解
起因:
項(xiàng)目采用vue3+elmentui-plus +ts 搭建成的。用戶界面設(shè)計(jì)上需要一個(gè)帶全選的下拉選擇框。而element plus 官網(wǎng) 提供的下拉多選框是

這種形式是沒(méi)有全選按鈕的,并且樣式也不符合想像中的全選的操作。故開始想法子去結(jié)合一個(gè)新的條件去封裝一個(gè)新的組件。
效果展示:




設(shè)計(jì)原理:
由于用戶更加熱衷于帶有全選的下拉框,并且不喜歡右側(cè)的√的選擇標(biāo)識(shí),而需要換成和多選框一直的選中框,于是,根據(jù)已有的條件,我采用 el-select + el-checkbox的形式去編寫這個(gè)組件。
組件代碼構(gòu)成 創(chuàng)建子組件selectCheckBox.vue文件
html 部分
<el-select
v-model="menusTitle"
multiple
collapse-tags
collapse-tags-tooltip
:placeholder="props.placeholder"
clearable
@clear="clearData"
>
<!-- @change="changeSelectMenu" -->
<el-checkbox v-model="checkedAll" @change="selectAll">全選</el-checkbox>
<el-option
v-for="(item, index) in menuList"
:key="item[props.id]"
:value="item[props.id]"
>
<el-checkbox
:label="item[props.label]"
size="large"
@change="changeCheckBox(item, index)"
:checked="isChecked(item, index)"
v-model="checkBoxObj[index]"
/>
</el-option>
</el-select>js部分
<script lang="ts" setup>
import { ref, reactive, defineProps, defineEmits } from "vue";
const props = defineProps({
list: { type: Array, required: true },
id: { type: String, required: true },
label: { type: String, required: true },
modelValue: { type: Array },
placeholder: { type: String, default: "選擇" },
});
const emit = defineEmits(["update:modelValue"]);
const value = ref("");
const checkedAll = ref("false");
const menus = ref([]);
const menuList = props.list;
const checkBoxObj = ref({});
menuList.forEach((res, index) => {
checkBoxObj.value[index] = false;
});
const menusTitle = ref([]);
const changeSelectMenu = (val) => {};
const selectAll = (value) => {
menus.value = [];
menusTitle.value = [];
if (value) {
menuList.forEach((item, index) => {
menus.value.push(item[props.id]);
menusTitle.value.push(item[props.label]);
checkBoxObj.value[index] = true;
});
} else {
menus.value = [];
menusTitle.value = [];
menuList.forEach((item, index) => {
checkBoxObj.value[index] = false;
});
}
emit("update:modelValue", menus.value);
};
const isChecked = (item) => {
return menus.value.indexOf(item[props.id]) > -1;
};
const changeCheckBox = (item, index) => {
let i = menus.value.indexOf(item[props.id]);
if (i == -1) {
menus.value.push(item[props.id]);
menusTitle.value.push(item[props.label]);
} else {
menus.value.splice(i, 1);
menusTitle.value.splice(i, 1);
}
if (menus.value.length == menuList.length) {
checkedAll.value = true;
} else {
checkedAll.value = false;
}
emit("update:modelValue", menus.value);
};
const clearData = () => {
menus.value = [];
menusTitle.value = [];
emit("update:modelValue", menus.value);
checkedAll.value = false;
menuList.forEach((item, index) => {
checkBoxObj.value[index] = false;
});
};
</script>css部分:
<style lang="scss" scoped>
.el-select-dropdown {
.el-checkbox {
display: flex;
align-items: center;
padding-left: 20px;
width: 100%;
box-sizing: border-box;
}
.el-select-dropdown__item {
// background-color: red !important;
padding: 0;
display: flex;
align-items: center;
}
}
</style>父組件調(diào)用
html 引入部分
<selectCheckBox
v-model="value3 "
:list="options"
id="value"
label="label"
placeholder="選擇項(xiàng)目"
></selectCheckBox>js引入部分
import selectCheckBox from "@_components/dataClassification/selectCheckBox.vue";
const value3 = ref([]);
const options = [
{
value: "1",
label: "項(xiàng)目一",
},
{
value: "2",
label: "項(xiàng)目二",
},
{
value: "3",
label: "項(xiàng)目三",
},
];總結(jié)
該組件 還在升級(jí)過(guò)程中,二次封裝組件處理。進(jìn)一步的封裝過(guò)程目標(biāo)是,做一個(gè)類el-select的參數(shù)的組件。今日留做記錄.
相關(guān)文章
vue使用element-plus依賴實(shí)現(xiàn)表格增加的示例代碼
這篇文章主要為大家詳細(xì)介紹了vue使用element-plus依賴實(shí)現(xiàn)表格增加,文中示例代碼講解的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2023-12-12
Vue項(xiàng)目中l(wèi)oading卡死的問(wèn)題及解決方案
文章剖析Vue項(xiàng)目中l(wèi)oading卡死問(wèn)題,揭示其本質(zhì)為異步阻塞與響應(yīng)式渲染沖突,提出分五層解決方案:nextTick強(qiáng)制刷新、任務(wù)分片/Worker解耦、組件封裝、組合式API管理狀態(tài)、性能優(yōu)化與架構(gòu)調(diào)整,強(qiáng)調(diào)需從UI、異步、計(jì)算等多維度優(yōu)化2025-07-07
Vue實(shí)現(xiàn)固定定位圖標(biāo)滑動(dòng)隱藏效果
移動(dòng)端頁(yè)面,有時(shí)候會(huì)出現(xiàn)一些固定定位在底部圖標(biāo),比如購(gòu)物車等。這篇文章主要介紹了Vue制作固定定位圖標(biāo)滑動(dòng)隱藏效果,需要的朋友可以參考下2019-05-05
vue element-ui中table合計(jì)指定列求和實(shí)例
這篇文章主要介紹了vue element-ui中table合計(jì)指定列求和實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
vue使用vuedraggable對(duì)列表進(jìn)行拖拽排序
vuedraggable 是一個(gè)基于 Vue 的拖拽排序組件,它可以讓你輕松地在 Vue 應(yīng)用中實(shí)現(xiàn)拖拽排序功能,下面就跟隨小編一起來(lái)了解下它的具體應(yīng)用吧2024-12-12
vue實(shí)現(xiàn)鼠標(biāo)移入移出事件代碼實(shí)例
這篇文章主要介紹了vue實(shí)現(xiàn)鼠標(biāo)移入移出事件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
vue.js iview打包上線后字體圖標(biāo)不顯示解決辦法
這篇文章主要介紹了vue.js iview打包上線后字體圖標(biāo)不顯示解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01

