提要:项目中之前都是一层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图。为了个图做了好久。菜鸡的我飘过~~~~~