vue多級多選菜單組件開發_javascript技巧

來源:互聯網
上載者:User

本文執行個體為大家分享了vue多級多選菜單組件的製作方法,供大家參考,具體內容如下

要開發一個這樣的多級多選菜單組件,功能是:

點擊父標題列可以開啟與摺疊子列表
點擊父標題列的勾選表徵圖可以全選或取消子列表
點擊子列表的勾選表徵圖達到全選時,父標題列的勾選表徵圖自動勾選;反之,沒達到全選時,父標題列的勾選表徵圖自動取消勾選
當所有父標題列的勾選表徵圖達到全選時,最底下那個全選框自動勾選;反之,沒達到全選時,最底下那個全選框自動取消勾選
點擊最底下那個全選框可以全選或取消全部的勾選表徵圖

所以總結起來我們重點要利用子列表勾選了哪些項來計算出父標題與底下的全選框是自動勾選還是自動取消,並且父標題與底下的全選框在選擇變化時子列表應有什麼變化。要做到以上,實現過程是:

構建我們model層資料

datas : [ { //用於判斷是否展示子列表 isShowListItem : false, //用於記錄選中了哪些子項 selected : [], //父標題 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數組中,當子清單項目的checked發生變化時,就會把當前項的id記錄到selected數組裡去

<input type="checkbox":value="item.id"v-model="data.selected">

當父標題勾選變化時的處理方法
自動處理父標題勾選表徵圖的變化
在HTML裡,通過綁定:checked=”isTitleChecked(data)”,這時,每當其他項變化時,父標題都會調用一下isTitleChecked這個方法去判斷一下這時自己的checked狀態是true還是false,從而達到根據子項選中數目不同,父標題自動變化的目的。
通過@change=”changeTitleChecked(data,$event)”,每當父標題主動勾選或取消時觸發
父標題HTML

<input :id="data.listTitle" class="list-input" type="checkbox" :checked="isTitleChecked(data)" @change="changeTitleChecked(data,$event)">

父標題JS

changeTitleChecked方法:當主動觸發父標題的勾選表徵圖時,如果這次觸發chaeked的狀態是true,則要把子清單項目中沒選中的全部選中,即將它們全部加進selected數組中;如果是false,則要把子清單項目全部取消選中,即清空selected數組。
isTitleChecked方法:當子清單項目全部選中時自動勾選父標題。

/*** 當父標題狀態變化時的處理方法* @param data [當前項的data]* @param event [當前項的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 = []; }}
/*** 判斷父標題選擇狀態* @param data [當前項的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; });}

當底下的全選框變化時的處理方法
自動處理底下的全選框的變化

全選框HTML:

<input id="all-checked" type="checkbox" :checked="isAllChecked()" @change="changeAllChecked($event)">

全選框JS:

changeAllChecked方法:當主動觸發全選框時,如果checked為true,則將全部的子項都放進selected數組裡;反之則清空全部selected數組。
isAllChecked 方法:判斷selected數組的長度是否等於全部子項數,如果相等,則全選框checked狀態設為true。

/*** 全選框change事件的回調處理方法* @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 = []; }) }}/*** 判斷全選框選擇狀態* @returns {boolean}*/isAllChecked : function () { return this.datas.every(function (data) { return data.selected.length === data.listItem.length; });}

本文已被整理到了《Vue.js前端組件學習教程》,歡迎大家學習閱讀。

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.