vue中v-for循环选中点击的元素并对该元素添加样式操作


Posted in Javascript onJuly 17, 2020

相信大家都会遇到这种情况:v-for循环时,我只需要点击到的元素做出相应反应,其他的元素不变;但是往往所有v-for循环出的元素都会变化。如下面的代码:我需要点击到的元素添加一个类样式,其他元素不变,但是这样会导致所有的元素都会变化

html:

<div v-for = "(item,index) in items" :class = 'addclass:isactive' @click='onclick()'>
 <span>{{item.name}}</span>
</div>

css:

.addclass{
 color : red;
}

js:

data:{
 items :[
  {
  name :'apple',
  price: '5$'
  },
  {
  name:'banana',
  price:"3$"
  },
  {
  name:'pear',
  price:'4$'
  }
 ],
 isactive : false
}

onclick(){
 this.isactive = true
}

解决方法:使用index索引,当点击一个元素时,将该元素的index索引赋给类样式的启用变量,如果该变量和index相等时,则启用该类样式

html:

<div v-for = "(item,index) in items" :class = "isactive == index ? 'addclass' : '' " @click='onclick(index)'>
 <span>{{item.name}}</span>
</div>

css:

.addclass{
 color : red;
}

js:

data:{
 items :[
  {
  name :'apple',
  price: '5$'
  },
  {
  name:'banana',
  price:"3$"
  },
  {
  name:'pear',
  price:'4$'
  }
 ],
 isactive : -1
}
onclick(index){

 //将点击的元素的索引赋值给bian变量
 this.isactive = index
}

补充知识:v-for 遍历数组点击动态绑定样式

这可能是一个对于任何js开发者来说都非常简单的问题,或者根本谈不上被叫做“问题”,“基操”而已。但是,很遗憾,我为此开了个篇幅简略记录下它,因为这是我处于前端开发基础阶段数次阻滞过我的问题,以下暂提供一种解决方案,后续可能补充。

这类问题多见于单页面应用(SPA)中的侧边栏、表格列等,当我曾拿到这个需求时,我以为我能用Vue中介绍的Class动态绑定来解决,事实上的确如此,但我用错了,请看我错误的解决方法:

HTML

<template>
<!-- 点击某个绑定样式 -->
 <ul>
  <li v-for="(data, index) in formData" :key="data.id" :class="{active: isActive}" @click="currentInfo(data, index)">name: {{data.name}},age: {{data.age}}
  </li>
 </ul>

</template>

JavaScript

<script>
export default {
  name: 'classActive'
  data() {
    return {
      isActive: false,  // 用来判断active样式类是否显示
      formData: [{
        id: 1,
        name: 'zhangsan',
        age: 20
      },{
        id: 2,
        name: 'lisi',
        age: 21
      },{
        id: 3,
        name: 'wangwu',
        age: 22
      }
    }
  }
  methods: {
    currentInfo(data, index) {
      if(data.id-1 === index) { // 当前选择的列表项与列表id号相等则绑定active
       this.isActive = true;
      }
    }
  }
}
</script>

Style

<style scoped>
  li {
    list-style: none;
    border: 1px solid #333;
  }
  .active {
    background: light-gray;
  }
</style>

好,于是我兴冲冲地切回页面看效果,结果:

vue中v-for循环选中点击的元素并对该元素添加样式操作

当我点击其中的一行时,结果所有的li都绑上了active样式,稍微想一下,相信大家都能找到问题所在,所有li的样式都由一个isActive控制,当我点击一行,全局变量isActive变为ture,当然所有的li都会绑上啦!然后我就停滞下来,思索一番,想过在data数组各项里插入一个标识用来单独控制,但被我否决了,一来对象中插入属性麻烦,二来污染数据源。于是,便有了下面我要说的解决方法:

HTML

<template>
<!-- 点击某个绑定样式 -->
 <ul>
  <li v-for="(data, index) in formData" :key="data.id" :class="currentClass(index)" @click="currentInfo(index)">name: {{data.name}},age: {{data.age}}
  </li>
 </ul>

</template>

JavaScript

<script>
export default {
  name: 'classActive'
  data() {
    return {
      currentNumber: 0,  // 用来判断active样式类是否显示
      formData: [{
        id: 1,
        name: 'zhangsan',
        age: 20
      },{
        id: 2,
        name: 'lisi',
        age: 21
      },{
        id: 3,
        name: 'wangwu',
        age: 22
      }
    }
  }
  methods: {
    currentInfo(index) {
      this.currentNumber = index;
    },
    currentClass(index) {
      return [this.currentNumber == index ? 'active' : ''];
    }
  }
}
</script>

Style

<style scoped>
  li {
    list-style: none;
    border: 1px solid #333;
  }
  .active {
    background: light-gray;
  }
</style>

这里,我新建一个变量空间存储当前点击的列表序号index,这样不管怎样点击,这个currentNumber永远是唯一的,那么和它相等的数组项也是唯一的,相等即可绑定active样式了,看效果:

vue中v-for循环选中点击的元素并对该元素添加样式操作

好,以上就解决了遍历数组点击动态绑定样式,以后我找到更好的,我会补充,也非常欢迎大家在评论里给出更好的建议。

以上这篇vue中v-for循环选中点击的元素并对该元素添加样式操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js event事件的传递与冒泡处理
Dec 06 Javascript
异步加载script的代码
Jan 12 Javascript
JSON字符串转JSON对象
Jul 31 Javascript
jQuery div拖拽用法实例
Jan 14 Javascript
jQuery密码强度验证控件使用详解
Jan 05 Javascript
AngularJS读取JSON及XML文件的方法示例
May 25 Javascript
Angularjs修改密码的实例代码
May 26 Javascript
AngularJS实现的输入框字数限制提醒功能示例
Oct 26 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
May 23 Javascript
js实现网页版贪吃蛇游戏
Feb 22 Javascript
Openlayers显示瓦片网格信息的方法
Sep 28 Javascript
详解Vite的新体验
Feb 22 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
Jul 17 #Javascript
Vue项目中数据的深度监听或对象属性的监听实例
Jul 17 #Javascript
解决vue无法侦听数组及对象属性的变化问题
Jul 17 #Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
Jul 17 #Javascript
Vue element-ui父组件控制子组件的表单校验操作
Jul 17 #Javascript
简单了解常用的JavaScript 库
Jul 16 #Javascript
jQuery加PHP实现图片上传并提交的示例代码
Jul 16 #jQuery
You might like
PHP面向对象精要总结
2014/11/07 PHP
PHP向socket服务器收发数据的方法
2015/01/24 PHP
php+jQuery递归调用POST循环请求示例
2016/10/14 PHP
css结合js制作下拉菜单示例代码
2014/02/27 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
2016/08/05 Javascript
在vue-cli中组件通信的方法
2017/12/16 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
Javascript和jquery在selenium的使用过程
2019/10/31 jQuery
python下如何让web元素的生成更简单的分析
2008/07/17 Python
python实现的udp协议Server和Client代码实例
2014/06/04 Python
总结python实现父类调用两种方法的不同
2017/01/15 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
解决pycharm无法识别本地site-packages的问题
2018/10/13 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
Django框架 Pagination分页实现代码实例
2019/09/04 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
python的链表基础知识点
2020/09/13 Python
用纯css3实现的图片放大镜特效效果非常不错
2014/09/02 HTML / CSS
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
平民服装店创业计划书
2014/01/17 职场文书
俞敏洪北大演讲稿
2014/05/22 职场文书
小学英语教师先进事迹
2014/05/28 职场文书
党员个人剖析材料2014
2014/10/08 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
2014司机年终工作总结
2014/12/05 职场文书
2015共产党员公开承诺书
2015/01/22 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书
商场营业员岗位职责
2015/04/14 职场文书
刑事附带民事起诉状
2015/05/19 职场文书
2015年生活老师工作总结
2015/05/27 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android
一行Python命令实现批量加水印
2022/04/07 Python