提要:項目中之前都是一層checkbox選擇,書寫比較簡單。這次項目中遇到了多層。雖說邏輯不復雜,但是書寫中也遇到問題,並且對watch有新的理解。本文不啰嗦css和布局內容。主要描述雙向綁定和數據的獲取。
第一步:看靜態頁面最終效果圖和HTML結構布局。
圖一說明:點擊灰色背景區域的父級地址名稱,緊鄰的下方白色背景的子集訂單被選中。點擊全選按鈕所有checkbox都選中。

圖2.3說明:圖2是雙層v-for循環。每個子集的input綁定了相同的v-model值。並且綁定了value值。圖三綁定了v-modell並且綁定了事件change.


第二步:數據data聲明和重構。

因為我們的子集v-model值是動態生成的,所以我們再請求到列表數據todolist以后需要對dataModel進行結構重組。可以把每個子集列表綁定的value值對應放入dataModel中。
重組代碼如下:
var len = this.todolist.length;
for (var i = 0; i < len; i ++) { var item1 = {value1: []}; this.dataModel.push(item1); }
第三步,監聽dataModel中雙向綁定的數據變化,通過變化去控制父級是否選中,全選是否選中,選中的訂單數量總數。
代碼說明:此處的dataModel是數組里面嵌套數組對象,所以我們需要深度監聽。深度監聽的固定語法結構
*****:{
handler(){
/*需要做的事情巴拉巴拉巴拉*/
},
deep:true
}
同時需要說明自己當時進入誤區的一點,監聽的這么多data里面建議只監聽子集內容dataModel,,不要監聽其他的checkbox 綁定的v-model值,否則容易出現死循環。嘎嘎嘎嘎,我就卡死了。
watch:{
dataModel:{
handler (val) {
this.allValue = [];
//控制父級
for(var i=0;i<val.length;i++){
if(!this.todolist[i]){
return false;
}
if(val[i].value1.length == this.todolist[i].TrtplpomainGroupByList.length){
this.allValue.push(i)
}
}
this.count();
//控制全選按鈕
if(this.allValue.length == this.todolist.length){
this.resultSele = true;
}else{
this.resultSele = false;
}
},
deep:true
},
},
第四步,點擊父級的按鈕,觸發的事件。和計算總數的方法。其中通過列表index索引號找尋數據
//計算選中的總數
count(){
this.totalNum = 0;
for(var i=0;i<this.dataModel.length;i++){
this.totalNum += this.dataModel[i].value1.length;
}
},
//父級點擊
changeSele(value,index){
var check = false;
for(var i=0;i<this.allValue.length;i++){
if(this.allValue[i] == index){
check = true;
}
};
if(check){
this.dataModel[index].value1 = [];
for(var i =0;i<value.length;i++){
this.dataModel[index].value1.push(value[i]);
};
}else{
this.dataModel[index].value1 = [];
}
},
第五步點擊全選按鈕的方法。不論是否選擇了,先清空dataModel值,然后再根據全選按鈕是否選中resultSele的值來重新給dataModel賦值。因為雙向綁定,所以dataModel中只要有值,input的就響應選中。
//點擊全選按鈕
resultSeleF(){
var len = this.todolist.length;
this.dataModel = [];
for (var i = 0; i < len; i ++) {
var item1 = {value1: []};
this.dataModel.push(item1);
};
if(this.resultSele){
for (var i = 0; i < len; i ++) {
for(var j=0;j<this.todolist[i].TrtplpomainGroupByList.length;j++){
var ctx = this.todolist[i].TrtplpomainGroupByList[j];
this.dataModel[i].value1.push(ctx);
};
}
}
}
以上為,多層input選擇的vue的書寫方式。如果有不對的地方歡迎指正。代碼寫的不是特別好,哈哈哈哈。一下圖片為最終效果gif圖。為了個圖做了好久。菜雞的我飄過~~~~~

