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 }
3.汇总

1 <div id="hobby"> 2 <div class="lists"> 3 <ul> 4 <li class="border_first_after" v-for="(item,index) in lists" @click="isChecked(item)"> 5 <div class="flex_parent"> 6 <div class="lists_left">{{item.name}}</div> 7 <div class="flex_child lists_right"> 8 <span class="isSelected" :class="{isChecked:item.checked}">√</span> 9 </div> 10 </div> 11 </li> 12 </ul> 13 </div> 14 <p class="remarks">最多选择4个</p> 15 <div style="text-align: right"> 16 <input class="saveBtn" type="button" value="保存" @click="save"> 17 </div> 18 </div>

1 /** 2 * Created by aaron on 2017/4/26. 3 */ 4 new Vue({ 5 el:'#hobby', 6 data:{ 7 checked:false, 8 isLists:[], 9 lists:[ 10 {name:'亲子活动'}, 11 {name:'体育赛事'}, 12 {name:'DIY其他'}, 13 {name:'多人聚会'}, 14 {name:'慈善公益'}, 15 {name:'周别户外'} 16 ] 17 }, 18 methods:{ 19 isChecked:function(item){ 20 this.isLists=[]; 21 var _this=this; 22 /*选中当前*/ 23 if(typeof item.checked=='undefined'){ 24 this.$set(item,'checked',true); 25 }else{ 26 item.checked=!item.checked; 27 } 28 console.log('item:'+JSON.stringify(item)); 29 30 /*判断选中个数*/ 31 this.lists.forEach(function(item){ 32 if(item.checked){ 33 if(_this.isLists.length<4){ 34 _this.isLists.push(item); 35 }else{ 36 item.checked=false; 37 alert('最多选择4个'); 38 } 39 } 40 }); 41 //console.log('isLists:'+JSON.stringify(this.isLists)); 42 }, 43 save:function(){ 44 console.log('isLists:'+JSON.stringify(this.isLists)); 45 } 46 } 47 });
4.更多
参考:vue官网:https://cn.vuejs.org/v2/guide/reactivity.html
vue总结:https://segmentfault.com/a/1190000005832164
作者:PC.aaron
出处:http://www.cnblogs.com/aaron-pan/
GitHub:https://github.com/PCAaron/PCAaron.github.io,欢迎star,获取最新内容
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?