vue多級多選菜單組件開發(fā)
本文實例為大家分享了vue多級多選菜單組件的制作方法,供大家參考,具體內(nèi)容如下

要開發(fā)一個這樣的多級多選菜單組件,功能是:
點擊父標(biāo)題欄可以打開與折疊子列表
點擊父標(biāo)題欄的勾選圖標(biāo)可以全選或取消子列表
點擊子列表的勾選圖標(biāo)達(dá)到全選時,父標(biāo)題欄的勾選圖標(biāo)自動勾選;反之,沒達(dá)到全選時,父標(biāo)題欄的勾選圖標(biāo)自動取消勾選
當(dāng)所有父標(biāo)題欄的勾選圖標(biāo)達(dá)到全選時,最底下那個全選框自動勾選;反之,沒達(dá)到全選時,最底下那個全選框自動取消勾選
點擊最底下那個全選框可以全選或取消全部的勾選圖標(biāo)
所以總結(jié)起來我們重點要利用子列表勾選了哪些項來計算出父標(biāo)題與底下的全選框是自動勾選還是自動取消,并且父標(biāo)題與底下的全選框在選擇變化時子列表應(yīng)有什么變化。要做到以上,實現(xiàn)過程是:
構(gòu)建我們model層數(shù)據(jù)
datas : [
{
//用于判斷是否展示子列表
isShowListItem : false,
//用于記錄選中了哪些子項
selected : [],
//父標(biāo)題
listTitle : "保利南悅灣",
//子列表
listItem : [
{
id : 1,
name : "李小龍"
},
{
id : 2,
name : "周星馳"
},
{
id : 3,
name : "周杰倫"
}
]
},
{
isShowListItem : false,
selected : [],
listTitle : "南莊萬科城",
listItem : [
{
id : 4,
name : "大魔王"
},
{
id : 5,
name : "老妖怪"
}
]
}
]
記錄子列表勾選了哪些項
子列表通過v-model=”data.selected”去雙向綁定到selected數(shù)組中,當(dāng)子列表項的checked發(fā)生變化時,就會把當(dāng)前項的id記錄到selected數(shù)組里去
<input type="checkbox" :value="item.id" v-model="data.selected" >
當(dāng)父標(biāo)題勾選變化時的處理方法
自動處理父標(biāo)題勾選圖標(biāo)的變化
在HTML里,通過綁定:checked=”isTitleChecked(data)”,這時,每當(dāng)其他項變化時,父標(biāo)題都會調(diào)用一下isTitleChecked這個方法去判斷一下這時自己的checked狀態(tài)是true還是false,從而達(dá)到根據(jù)子項選中數(shù)目不同,父標(biāo)題自動變化的目的。
通過@change=”changeTitleChecked(data,$event)”,每當(dāng)父標(biāo)題主動勾選或取消時觸發(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)主動觸發(fā)父標(biāo)題的勾選圖標(biāo)時,如果這次觸發(fā)chaeked的狀態(tài)是true,則要把子列表項中沒選中的全部選中,即將它們?nèi)考舆Mselected數(shù)組中;如果是false,則要把子列表項全部取消選中,即清空selected數(shù)組。
isTitleChecked方法:當(dāng)子列表項全部選中時自動勾選父標(biāo)題。
/**
* 當(dāng)父標(biāo)題狀態(tài)變化時的處理方法
* @param data [當(dāng)前項的data]
* @param event [當(dā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)前項的data]
* @returns {boolean}
*/
isTitleChecked : function (data) {
var _selected = data.selected;
var _listItem = data.listItem;
// 驗證selected中是否含有全部的item的id 如果是 證明title要選中
return _listItem.every(function (item) {
return _selected.indexOf(item.id) != -1;
});
}
當(dāng)?shù)紫碌娜x框變化時的處理方法
自動處理底下的全選框的變化
全選框HTML:
<input id="all-checked" type="checkbox" :checked="isAllChecked()" @change="changeAllChecked($event)" >
全選框JS:
changeAllChecked方法:當(dāng)主動觸發(fā)全選框時,如果checked為true,則將全部的子項都放進selected數(shù)組里;反之則清空全部selected數(shù)組。
isAllChecked 方法:判斷selected數(shù)組的長度是否等于全部子項數(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組件的教程,請大家點擊專題vue.js組件學(xué)習(xí)教程進行學(xué)習(xí)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue3使用threejs實現(xiàn)3D卡片水平旋轉(zhuǎn)效果的示例代碼
這篇文章主要介紹了在vue3中使用threejs實現(xiàn)3D卡片水平旋轉(zhuǎn)效果,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-04-04
vue+axios?methods方法return取不到值問題及解決
這篇文章主要介紹了vue+axios?methods方法return取不到值問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10
Vue 頁面監(jiān)聽用戶預(yù)覽時間功能的實現(xiàn)代碼
這篇文章主要介紹了Vue 頁面如何監(jiān)聽用戶預(yù)覽時間,首先需要借助vue頁面的生命周期函數(shù)mounted和destroyed,分別加入開始計時和清除計時的邏輯,通過相關(guān)操作實現(xiàn)此功能,需要的朋友可以參考下2021-07-07
vue element ui使用選擇器實現(xiàn)地區(qū)選擇兩種方法
這篇文章主要給大家介紹了關(guān)于vue element ui使用選擇器實現(xiàn)地區(qū)選擇的兩種方法,Element UI是一套基于Vue.js開發(fā)的UI組件庫,其中包含了地區(qū)選擇器(Cascader)組件,需要的朋友可以參考下2023-09-09
前端框架Vue父子組件數(shù)據(jù)雙向綁定的實現(xiàn)
Vue項目中經(jīng)常使用到組件之間的數(shù)值傳遞,實現(xiàn)的方法很多,但是原理上基本大同小異。這篇文章將給大家介紹Vue 父子組件數(shù)據(jù)單向綁定與Vue 父子組件數(shù)據(jù)雙向綁定的對比從而認(rèn)識雙向綁定2021-09-09

