欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Vue 点击li动态改变元素样式

程序员文章站 2022-07-14 22:57:01
...

一、问题描述

为了实现点击侧边栏中一项,改变当前选中项的背景图片效果。原本使用循环遍历清除样式再单独添加样式可以实现,但是总感觉会有更简洁的方式实现。今天找到了方法,故而小小记录一下。

template内容

<ul>
  <li class="siderBarItem"
    v-for="item in sideBarItems"
    :key="item.value" 
    :value="item.value" @click="goToProductOption(item.value)"
  >
    <span>{{item.label}}</span>
  </li>
</ul>

二、原来方法

其中 unSelectedBgi 、selectedBgi已经通过import方式引入当前vue组件中。
原来是通过获取到所有的li元素,循环遍历。先将所有li的背景图片修改为未选中的,然后设置当前选中的背景图片。感觉有些繁琐。代码也不简洁

代码如下(示例):

goToProductOption(itemVal){
  // 滚动到某个元素
  document.getElementById(itemVal).scrollIntoView({
    block: 'start',
    behavior: 'smooth'
  })
  // 设置背景图片
  let items = document.getElementsByClassName('siderBarItem')
  // 将所有li的背景图片修改为未选中的
  Array.from(items).forEach(item => {
    item.style.background = `url(${unSelectedBgi})`
  })
  // 修改当前选中的背景图片
  Array.from(items).forEach(item => {
    if(item.attributes['value'].value === itemVal){
      item.style.background = `url(${selectedBgi})`
    }
  })
},

新方法

1.data中定义变量

selectedItemVal: '0', // 侧边栏选中值,默认是第一个

2. v-bind 与class 动态绑定

在li中新增以下代码段:

:class="{selectedPic: selectedItemVal === item.value}"

绑定selectedPic类。当选中的值与当前li的值一致时,为当前的li新增selectedPic类

3. 修改点击事件的代码

关键代码:this.selectedItemVal = itemVal

goToProductOption(itemVal){
  // 滚动到某个元素
  document.getElementById(itemVal).scrollIntoView({
    block: 'start',
    behavior: 'smooth'
  })
  // 设置背景图片
  this.selectedItemVal = itemVal
},

4. 定义selectedPic的样式

/* li的默认样式,未选中状态 */
.siderBarItem{
  font-size: 15px;
  color: #7e7f7f;
  padding-left: 35px;
  height: 50px;
  line-height: 50px;
  background: url('../../assets/images/left_nav_bg.png');
}
/*选中的样式*/
.selectedPic{
  background: url('../../assets/images/left_nav_bg_pre.png');
}

这样就可以实现同样的效果啦,代码还简洁不少

总结

主要用到的知识点是:class的动态绑定和根据索引或者唯一值来判断是否为当前元素添加class属性

链接

最后附上官方讲解地址:
Class与style绑定:https://cn.vuejs.org/v2/guide/class-and-style.html

如果也遇到同样的问题,希望这篇文章给你一些灵感。