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 相关文章推荐
DOMAssitant最新版 DOMAssistant 2.5发布
Dec 25 Javascript
jquery中获取id值方法小结
Sep 22 Javascript
JavaScript 学习笔记之数据类型
Jan 14 Javascript
js获取json元素数量的方法
Jan 27 Javascript
聊一聊JavaScript作用域和作用域链
May 03 Javascript
JavaScript的ExtJS框架中表格的编写教程
May 21 Javascript
浅谈JavaScript 标准对象
Jun 02 Javascript
基于Axios 常用的请求方法别名(详解)
Mar 13 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
Aug 23 jQuery
小程序如何使用分包加载的实现方法
May 22 Javascript
vuex state中的数组变化监听实例
Nov 06 Javascript
jQuery弹框插件使用方法详解
May 26 jQuery
在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强大的时间转换函数strtotime
2016/02/18 PHP
Zend Framework教程之模型Model用法简单实例
2016/03/04 PHP
PHP编程中尝试程序并发的几种方式总结
2016/03/21 PHP
php版微信公众账号第三方管理工具开发简明教程
2016/09/23 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
php修改数组键名的方法示例
2017/04/15 PHP
jQuery实现ichat在线客服插件
2014/12/29 Javascript
FullCalendar日历插件应用之数据展现(一)
2015/12/23 Javascript
dedecms页面如何获取会员状态的实例代码
2016/03/15 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
2016/07/12 Javascript
js 声明数组和向数组中添加对象变量的简单实例
2016/07/28 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
Vuejs第十一篇组件之slot内容分发实例详解
2016/09/09 Javascript
WEB前端实现裁剪上传图片功能
2016/10/17 Javascript
详解vue嵌套路由-params传递参数
2017/05/23 Javascript
node.js中grunt和gulp的区别详解
2017/07/17 Javascript
基于javaScript的this指向总结
2017/07/22 Javascript
js异步编程小技巧详解
2017/08/14 Javascript
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
Vue拖拽组件开发实例详解
2018/05/11 Javascript
vue实现简单loading进度条
2018/06/06 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
2018/07/26 Javascript
axios取消请求的实践记录分享
2018/09/26 Javascript
vue-cli3单页构建大型项目方案
2020/04/07 Javascript
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
PyQt5响应回车事件的方法
2019/06/25 Python
tensorflow 分类损失函数使用小记
2020/02/18 Python
python实现引用其他路径包里面的模块
2020/03/09 Python
CSS3实现红包抖动效果
2020/12/23 HTML / CSS
驴妈妈旅游网:中国新型的B2C旅游电子商务网站
2016/08/16 全球购物
客运企业隐患排查工作方案
2014/06/06 职场文书
先进基层党组织材料
2014/12/25 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书
女方家长婚礼致辞
2015/07/27 职场文书
MySQL表锁、行锁、排它锁及共享锁的使用详解
2022/04/02 MySQL