前言

一直纠结着使用v-for进行列表渲染时如何为当前的元素添加是否选中的标识。

1.v-for进行列表渲染

  1. <div class="lists">
  2. <ul>
  3. <li class="border_first_after" v-for="(item,index) in lists" @click="isChecked(item)">
  4. <div class="flex_parent">
  5. <div class="lists_left">{{item.name}}</div>
  6. <div class="flex_child lists_right">
  7. <span class="isSelected" :class="{isChecked:item.checked}"></span>
  8. </div>
  9. </div>
  10. </li>
  11. </ul>
  12. </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

v-for并判断当前元素是否选中:$set实现响应添加属性的更多相关文章

  1. JS判断是不是本页面并且,给标签添加属性和属性值

    大多是在导航栏中用到的,在导航栏中在主页和在其他的网页点击导航栏中的主页是不同的,主要就是判断这个. 我是在ascs页面中写的. 下面先看标签: <a href="http://www ...

  2. jQuery通过判断 checkbox 元素的 checked 属性,判断 checkbox是否被选中

    jQuery设置复选框的属性<input type="checkbox"/> $("input").attr("checked" ...

  3. jQuery 判断页面元素是否存在的代码

    在原生的Javascript里,当我们对某个页面元素进行某种操作前,最好先判断这个元素是否存在.原因是对一个不存在的元素进行操作是不允许的. 例如: document.getElementById(& ...

  4. 用jQuery判断一个元素的各种状态

    用jQuery判断一个元素是否显示   用jQuery判断一个元素是否显示:$(element).is(":visible"); 类似的,判断一个元素是不是第一个子元素:$(ele ...

  5. jQuery判断当前元素显示状态并控制元素的显示与隐藏

    1.jQuery判断一个元素当前状态是显示还是隐藏 $("#id").is(':visible');   //true为显示,false为隐藏 $("#id") ...

  6. jQuery基础 -- 如何判断页面元素存在与否

    在传统的Javascript里,当我们对某个页面元素进行某种操作前,最好先判断这个元素是否存在.原因是对一个不存在的元素进行操作是不允许的.例如: document.getElementById(&q ...

  7. 判断jQuery元素是否隐藏

    第一种:使用CSS属性 复制代码 代码如下: var display =$('#id').css('display'); if(display == 'none'){    alert("被 ...

  8. jquery and js 判断一个元素是否存在

    一.javascript中判断一个元素是否存在 if(document.getElementById('example')){ // do sth } 二.jquery中判断一个元素是否存在 < ...

  9. jQuery判断当前元素是第几个元素&获取第N个元素

    假设有下面这样一段HTML代码: <ul> <li>jQuery判断当前元素是第几个元素示例</li> <li>jQuery获取第N个元素示例</ ...

随机推荐

  1. 阅读MDN文档之StylingBoxes(五)

    目录 BoxModelRecap Box properties Overflow Background clip Background origin Outline Advanced box prop ...

  2. Java_Date_02_截断日期到日

    oracle 的 trunc 函数能很方便的将日期截断.现在有个需求,需要用java实现与 oracle 的 trunc 函数 相同的功能. 1.需求:将日期截断到日 即 将格式为 2018-01-0 ...

  3. 盗版SQL Server的性能限制

    盗版SQL Server的性能限制 微软的SQL Server产品分为两种卖法1.盒装 :Server+CAL授权方式(SQL2017取消了Server+CAL授权方式,盗版序列号,一般电脑城有卖光盘 ...

  4. PHP 购物车 php闭包 array_walk

    <?php class Cart { const PRICE_BUTTER = 1.00; const PRICE_MILK = 3.00; const PRICE_EGGS = 6.95; p ...

  5. SQL基础学习_02_查询

    SELECT语句 1. SELECT语句查询列(字段):     SELECT <列名>    FROM <表名>;     该语句使用了两个SQL子句,SELECT子句列举了 ...

  6. node 使用koa2 异步读文件

    目的:在一个文件夹(image)中有很多文件夹和文件,排除掉文件,将所有文件夹找出来 知识点: async 函数与 await  .只有在async函数内部,才能使用await,await等的必须是p ...

  7. HTML5图片上传本地预览

    在开发 H5 应用的时候碰到一个问题,应用只需要一张小的缩略图,而用户用手机上传的确是一张大图,手机摄像机拍的图片好几 M,这可要浪费很多流量. 我们可以通过以下方式来解决. 获取图片 通过 File ...

  8. Java学习笔记-枚举类型

    枚举类型 枚举类型就是预先定义的一类常量集合,如一周的时间.水果的类型等.需要注意的几点内容如下: 定义枚举类时,Java默认继承java.lang.Enum,所以定义的枚举类不能继承其他类型: 枚举 ...

  9. SSM框架开发web项目系列(六) SpringMVC入门

    前言 我们最初的javaSE部分学习后,基本算是入门了,也熟悉了Java的语法和一些常用API,然后再深入到数据库操作.WEB程序开发,渐渐会接触到JDBC.Servlet/Jsp之类的知识,期间可能 ...

  10. ComboBox 中 DisplayMember 和 ValueMember 都是具体干什么的?

    ComboBox组件的数据绑定,在得到数据集后,只有设定好ComboBox组件的的三个属性就可以完成数据绑定了,这三个属性是:"DisplayMember". "Valu ...