vue多級(jí)多選菜單組件開發(fā)
本文實(shí)例為大家分享了vue多級(jí)多選菜單組件的制作方法,供大家參考,具體內(nèi)容如下
要開發(fā)一個(gè)這樣的多級(jí)多選菜單組件,功能是:
點(diǎn)擊父標(biāo)題欄可以打開與折疊子列表
點(diǎn)擊父標(biāo)題欄的勾選圖標(biāo)可以全選或取消子列表
點(diǎn)擊子列表的勾選圖標(biāo)達(dá)到全選時(shí),父標(biāo)題欄的勾選圖標(biāo)自動(dòng)勾選;反之,沒達(dá)到全選時(shí),父標(biāo)題欄的勾選圖標(biāo)自動(dòng)取消勾選
當(dāng)所有父標(biāo)題欄的勾選圖標(biāo)達(dá)到全選時(shí),最底下那個(gè)全選框自動(dòng)勾選;反之,沒達(dá)到全選時(shí),最底下那個(gè)全選框自動(dòng)取消勾選
點(diǎn)擊最底下那個(gè)全選框可以全選或取消全部的勾選圖標(biāo)
所以總結(jié)起來(lái)我們重點(diǎn)要利用子列表勾選了哪些項(xiàng)來(lái)計(jì)算出父標(biāo)題與底下的全選框是自動(dòng)勾選還是自動(dòng)取消,并且父標(biāo)題與底下的全選框在選擇變化時(shí)子列表應(yīng)有什么變化。要做到以上,實(shí)現(xiàn)過程是:
構(gòu)建我們model層數(shù)據(jù)
datas : [ { //用于判斷是否展示子列表 isShowListItem : false, //用于記錄選中了哪些子項(xiàng) selected : [], //父標(biāo)題 listTitle : "保利南悅灣", //子列表 listItem : [ { id : 1, name : "李小龍" }, { id : 2, name : "周星馳" }, { id : 3, name : "周杰倫" } ] }, { isShowListItem : false, selected : [], listTitle : "南莊萬(wàn)科城", listItem : [ { id : 4, name : "大魔王" }, { id : 5, name : "老妖怪" } ] } ]
記錄子列表勾選了哪些項(xiàng)
子列表通過v-model=”data.selected”去雙向綁定到selected數(shù)組中,當(dāng)子列表項(xiàng)的checked發(fā)生變化時(shí),就會(huì)把當(dāng)前項(xiàng)的id記錄到selected數(shù)組里去
<input type="checkbox" :value="item.id" v-model="data.selected" >
當(dāng)父標(biāo)題勾選變化時(shí)的處理方法
自動(dòng)處理父標(biāo)題勾選圖標(biāo)的變化
在HTML里,通過綁定:checked=”isTitleChecked(data)”,這時(shí),每當(dāng)其他項(xiàng)變化時(shí),父標(biāo)題都會(huì)調(diào)用一下isTitleChecked這個(gè)方法去判斷一下這時(shí)自己的checked狀態(tài)是true還是false,從而達(dá)到根據(jù)子項(xiàng)選中數(shù)目不同,父標(biāo)題自動(dòng)變化的目的。
通過@change=”changeTitleChecked(data,$event)”,每當(dāng)父標(biāo)題主動(dòng)勾選或取消時(shí)觸發(fā)
父標(biāo)題HTML
<input :id="data.listTitle" class="list-input" type="checkbox" :checked="isTitleChecked(data)" @change="changeTitleChecked(data,$event)" >
父標(biāo)題JS
changeTitleChecked方法:當(dāng)主動(dòng)觸發(fā)父標(biāo)題的勾選圖標(biāo)時(shí),如果這次觸發(fā)chaeked的狀態(tài)是true,則要把子列表項(xiàng)中沒選中的全部選中,即將它們?nèi)考舆M(jìn)selected數(shù)組中;如果是false,則要把子列表項(xiàng)全部取消選中,即清空selected數(shù)組。
isTitleChecked方法:當(dāng)子列表項(xiàng)全部選中時(shí)自動(dòng)勾選父標(biāo)題。
/** * 當(dāng)父標(biāo)題狀態(tài)變化時(shí)的處理方法 * @param data [當(dāng)前項(xiàng)的data] * @param event [當(dāng)前項(xiàng)的event] */ changeTitleChecked : function (data,event) { if (event.target.checked === true) { data.listItem.forEach(function (item) { data.selected.indexOf(item.id) === -1 && data.selected.push(item.id); }) }else { data.selected = []; } }
/** * 判斷父標(biāo)題選擇狀態(tài) * @param data [當(dāng)前項(xiàng)的data] * @returns {boolean} */ isTitleChecked : function (data) { var _selected = data.selected; var _listItem = data.listItem; // 驗(yàn)證selected中是否含有全部的item的id 如果是 證明title要選中 return _listItem.every(function (item) { return _selected.indexOf(item.id) != -1; }); }
當(dāng)?shù)紫碌娜x框變化時(shí)的處理方法
自動(dòng)處理底下的全選框的變化
全選框HTML:
<input id="all-checked" type="checkbox" :checked="isAllChecked()" @change="changeAllChecked($event)" >
全選框JS:
changeAllChecked方法:當(dāng)主動(dòng)觸發(fā)全選框時(shí),如果checked為true,則將全部的子項(xiàng)都放進(jìn)selected數(shù)組里;反之則清空全部selected數(shù)組。
isAllChecked 方法:判斷selected數(shù)組的長(zhǎng)度是否等于全部子項(xiàng)數(shù),如果相等,則全選框checked狀態(tài)設(shè)為true。
/** * 全選框change事件的回調(diào)處理方法 * @param event */ changeAllChecked : function (event) { if (event.target.checked === true) { this.datas.forEach(function (data) { data.listItem.forEach(function (item) { data.selected.indexOf(item.id) === -1 && data.selected.push(item.id); }) }) }else { this.datas.forEach(function (data) { data.selected = []; }) } } /** * 判斷全選框選擇狀態(tài) * @returns {boolean} */ isAllChecked : function () { return this.datas.every(function (data) { return data.selected.length === data.listItem.length; }); }
本文已被整理到了《Vue.js前端組件學(xué)習(xí)教程》,歡迎大家學(xué)習(xí)閱讀。
關(guān)于vue.js組件的教程,請(qǐng)大家點(diǎn)擊專題vue.js組件學(xué)習(xí)教程進(jìn)行學(xué)習(xí)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Vue3+TypeScript實(shí)現(xiàn)遞歸菜單組件的完整實(shí)例
- 原生Vue 實(shí)現(xiàn)右鍵菜單組件功能
- vue iview的菜單組件Mune 點(diǎn)擊不高亮的解決方案
- Vue.js下拉菜單組件使用方法詳解
- vue下拉菜單組件(含搜索)的實(shí)現(xiàn)代碼
- vue移動(dòng)端UI框架實(shí)現(xiàn)QQ側(cè)邊菜單組件
- vuejs實(shí)現(xiàn)遞歸樹型菜單組件
- Vue側(cè)滑菜單組件——DrawerLayout
- Vue.js手風(fēng)琴菜單組件開發(fā)實(shí)例
- Vue實(shí)現(xiàn)嵌套菜單組件
相關(guān)文章
vue點(diǎn)擊Dashboard不同內(nèi)容 跳轉(zhuǎn)到同一表格的實(shí)例
這篇文章主要介紹了vue點(diǎn)擊Dashboard不同內(nèi)容 跳轉(zhuǎn)到同一表格的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-11-11vue-quill-editor二次封裝,實(shí)現(xiàn)自定義文件上傳方式
這篇文章主要介紹了vue-quill-editor二次封裝,實(shí)現(xiàn)自定義文件上傳方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Vue開發(fā)項(xiàng)目中如何使用Font Awesome 5
Font Awesome是一套流行的圖標(biāo)字體庫(kù),我們?cè)趯?shí)際開發(fā)的過程中會(huì)經(jīng)常遇到需要使用圖標(biāo)的場(chǎng)景,對(duì)于一些常用的圖標(biāo),我們可以直接在Font Awesome中找到并且使用,這篇文章主要給大家介紹了關(guān)于Vue開發(fā)項(xiàng)目中如何使用Font Awesome5的相關(guān)資料,需要的朋友可以參考下2021-11-11vue項(xiàng)目中請(qǐng)求數(shù)據(jù)特別多導(dǎo)致頁(yè)面卡死的解決
這篇文章主要介紹了vue項(xiàng)目中請(qǐng)求數(shù)據(jù)特別多導(dǎo)致頁(yè)面卡死的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09解決Vue運(yùn)算符報(bào)錯(cuò):Syntax Error: Unexpected token問題
這篇文章主要介紹了解決Vue運(yùn)算符報(bào)錯(cuò):Syntax Error: Unexpected token問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01Vue實(shí)現(xiàn)帶進(jìn)度條的文件拖動(dòng)上傳功能
這篇文章主要介紹了Vue實(shí)現(xiàn)帶進(jìn)度條的文件拖動(dòng)上傳功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02多個(gè)Vue項(xiàng)目部署到服務(wù)器的步驟記錄
這篇文章主要給大家介紹了關(guān)于多個(gè)Vue項(xiàng)目部署到服務(wù)器的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10