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库 开发规则
Jan 31 Javascript
在js文件中如何获取basePath处理js路径问题
Jul 10 Javascript
详解jquery uploadify 上传文件
Nov 09 Javascript
JavaScript实现重置表单(reset)的方法
Apr 02 Javascript
实例讲解JS中setTimeout()的用法
Jan 28 Javascript
jquery过滤特殊字符',防sql注入的实现方法
Aug 17 Javascript
利用JS实现文字的聚合动画效果
Jan 22 Javascript
Angular中使用MathJax遇到的一些问题
Dec 15 Javascript
javascript显示动态时间的方法汇总
Jul 06 Javascript
Javascript中的奇葩知识,你知道吗?
Jan 25 Javascript
js闭包和垃圾回收机制示例详解
Mar 01 Javascript
vue cli4中mockjs在dev环境和build环境的配置详情
Apr 06 Vue.js
在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
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
php抓取页面与代码解析 推荐
2010/07/23 PHP
laravel 5 实现模板主题功能(续)
2015/03/02 PHP
php结合web uploader插件实现分片上传文件
2016/05/10 PHP
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
Node.js实现数据推送
2016/04/14 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
2017/07/04 Javascript
JavaScript 完成注册页面表单校验的实例
2017/08/19 Javascript
react+redux的升级版todoList的实现
2017/12/18 Javascript
基于webpack4搭建的react项目框架的方法
2018/06/30 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
实例介绍JavaScript中多种组合继承
2019/01/20 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
Antd中单个DatePicker限定时间输入范围操作
2020/10/29 Javascript
JavaScript基于SVG的图片切换效果实例代码
2020/12/15 Javascript
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
Sanic框架Cookies操作示例
2018/07/17 Python
Python中xml和dict格式转换的示例代码
2019/11/07 Python
Python sklearn中的.fit与.predict的用法说明
2020/06/28 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
css3弹性盒模型(Flexbox)详细介绍
2014/10/08 HTML / CSS
荷兰皇家航空公司中国官网:KLM中国
2017/12/13 全球购物
美国第二大连锁药店:Rite Aid
2019/04/03 全球购物
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
体育专业个人求职信范文
2013/12/27 职场文书
销售经理竞聘书
2014/03/31 职场文书
优秀班主任经验交流材料
2014/06/02 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
南京导游词
2015/02/03 职场文书
开业典礼致辞
2015/07/29 职场文书
儿子满月酒致辞
2015/07/29 职场文书
新员工入职感想
2015/08/07 职场文书