Vue3實(shí)現(xiàn)下拉選擇框多選功能的方法詳解
起因:
項(xiàng)目采用vue3+elmentui-plus +ts 搭建成的。用戶界面設(shè)計(jì)上需要一個(gè)帶全選的下拉選擇框。而element plus 官網(wǎng) 提供的下拉多選框是
這種形式是沒有全選按鈕的,并且樣式也不符合想像中的全選的操作。故開始想法子去結(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í)過程中,二次封裝組件處理。進(jìn)一步的封裝過程目標(biāo)是,做一個(gè)類el-select的參數(shù)的組件。今日留做記錄.
相關(guān)文章
Vue3使用postcss-px-to-viewport實(shí)現(xiàn)頁面自適應(yīng)
postcss-px-to-viewport 是一個(gè) PostCSS 插件,它可以將 px 單位轉(zhuǎn)換為視口單位,下面我們就看看如何使用postcss-px-to-viewport實(shí)現(xiàn)頁面自適應(yīng)吧2024-01-01淺談Vue.js應(yīng)用的四種AJAX請(qǐng)求數(shù)據(jù)模式
本篇文章主要介紹了淺談Vue.js應(yīng)用的四種AJAX請(qǐng)求數(shù)據(jù)模式,本文將詳細(xì)介紹在Vue應(yīng)用程序中實(shí)現(xiàn)AJAX的四個(gè)方法,有興趣的可以了解一下2017-08-08Vue.js結(jié)合bootstrap前端實(shí)現(xiàn)分頁和排序效果
這篇文章主要為大家詳細(xì)介紹了Vue.js結(jié)合bootstrap 前端實(shí)現(xiàn)分頁和排序效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12基于uniapp+vue3自定義增強(qiáng)版table表格組件「兼容H5+小程序+App端」
uv3-table:一款基于uniapp+vue3跨端自定義手機(jī)端增強(qiáng)版表格組件,支持固定表頭/列、邊框、斑馬紋、單選/多選,自定義表頭/表體插槽、左右固定列陰影高亮顯示,支持編譯兼容H5+小程序端+App端,H5+小程序+App端,多端運(yùn)行一致2024-05-05VUEJS實(shí)戰(zhàn)之修復(fù)錯(cuò)誤并且美化時(shí)間(2)
這篇文章主要為大家詳細(xì)介紹了VUEJS實(shí)戰(zhàn)之修復(fù)錯(cuò)誤并且美化時(shí)間,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06element-plus中如何實(shí)現(xiàn)按需導(dǎo)入與全局導(dǎo)入
本文主要介紹了element-plus中如何實(shí)現(xiàn)按需導(dǎo)入與全局導(dǎo)入,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11