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 相关文章推荐
javascript模拟的Ping效果代码 (Web Ping)
Mar 13 Javascript
[JSF]使用DataModel处理表行事件的实例代码
Aug 05 Javascript
javascript实现全角半角检测的方法
Jul 23 Javascript
深入理解逻辑表达式的用法 与或非的用法
Jun 06 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
Jul 27 Javascript
前端JS面试中常见的算法问题总结
Dec 23 Javascript
Angular路由简单学习
Dec 26 Javascript
微信小程序分页加载的实例代码
Jul 11 Javascript
JQuery 获取多个select标签option的text内容(实例)
Sep 07 jQuery
EasyUI的DataGrid绑定Json数据源的示例代码
Dec 16 Javascript
Vue代码整洁之去重方法整理
Aug 06 Javascript
node koa2 ssr项目搭建的方法步骤
Dec 11 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版国家代码、缩写查询函数代码
2011/08/14 PHP
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
PHP的cURL库简介及使用示例
2015/02/06 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
js 用于检测类数组对象的函数方法
2017/05/02 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
简单的Vue SSR的示例代码
2018/01/12 Javascript
解决vue-cli创建项目的loader问题
2018/03/13 Javascript
微信小程序实现弹幕墙(祝福墙)
2020/11/18 Javascript
python通过urllib2爬网页上种子下载示例
2014/02/24 Python
Python中文件遍历的两种方法
2014/06/16 Python
python实现简单ftp客户端的方法
2015/06/28 Python
python实现kmp算法的实例代码
2019/04/03 Python
python调用其他文件函数或类的示例
2019/07/16 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
2019/08/13 Python
Python实现字符串中某个字母的替代功能
2019/10/21 Python
pygame实现五子棋游戏
2019/10/29 Python
Python Django框架模板渲染功能示例
2019/11/08 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
Python如何解除一个装饰器
2020/08/07 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
Wojas罗马尼亚网站:波兰皮鞋品牌
2018/11/01 全球购物
苹果台湾官网:Apple台湾
2019/01/05 全球购物
数控专业自荐书范文
2014/03/16 职场文书
临床护理求职信
2014/04/26 职场文书
求职信名称怎么写
2014/05/26 职场文书
任命书范本大全
2014/06/06 职场文书
回门宴新娘答谢词
2015/09/29 职场文书