v-for并判断当前元素是否选中:$set实现响应添加属性
前言
一直纠结着使用v-for进行列表渲染时如何为当前的元素添加是否选中的标识。
1.v-for进行列表渲染
<div class="lists"> <ul> <li class="border_first_after" v-for="(item,index) in lists" @click="isChecked(item)"> <div class="flex_parent"> <div class="lists_left">{{item.name}}</div> <div class="flex_child lists_right"> <span class="isSelected" :class="{isChecked:item.checked}">√</span> </div> </div> </li> </ul> </div>
附:@click=‘isChecked(item)’,变化检查问题方法,:class='{isChecked:item.checked}',为当前对象添加标识。
2.this.$set():变化检查问题
受现代 JavaScript 的限制(以及废弃 Object.observe
),Vue 不能检测到对象属性的添加或删除。
由于 Vue 会在初始化实例时对属性执行 getter/setter
转化过程,所以属性必须在 data
对象上存在才能让 Vue 转换它,
这样才能让它是响应的。
Vue 不允许在已经创建的实例上动态添加新的根级响应式属性(root-level reactive property)。然而它可以使用
Vue.set(object, key, value)
方法将响应属性添加到嵌套的对象上。
1 isChecked:function(item){ 2 this.isLists=[]; 3 var _this=this; 4 /*选中当前*/ 5 if(typeof item.checked=='undefined'){ 6 this.$set(item,'checked',true); 7 }else{ 8 item.checked=!item.checked; 9 } 10 console.log('item:'+JSON.stringify(item)); 11 12 /*判断选中个数*/ 13 this.lists.forEach(function(item){ 14 if(item.checked){ 15 if(_this.isLists.length<4){ 16 _this.isLists.push(item); 17 }else{ 18 item.checked=false; 19 alert('最多选择4个'); 20 } 21 } 22 }); 23 //console.log('isLists:'+JSON.stringify(this.isLists)); 24 }