Vant轮播多个div结合二维数组的运用

需求说明

        在开发H5的时候,结合Vant组件的轮播组件Swipe实现如下功能。我们查阅vant组件库官方文档可以得知,每个SwipeItem组件代表一个卡片,实现的是每屏展示单张图片或者单个div轮播方式,具体可以查阅:Vant 2 - 轻量、可靠的移动端组件库 (youzan.github.io)

        这里的需求是要实现每屏展示多张图片或者说多个div卡片,那么这个时候就要考虑到多维数组嵌套循环,也就是两层循环。

实现

封装数组转换方法

        通常情况下,后台返回的数据一般都是一维数组结构,那么这个时候我们就需要自行处理数组结构,将一维数组转换为二维数组。我这里封装的一个数组转换方法如下:

  /**
   * 将一维数组转成二维数组
   * arr:一维数组
   * num:二维数组的长度
   * 返回值:二维数组
   * */
  changeArr(arr, num) {
    let newArr = []
    for (let i = 0; i < arr.length; i += num) {
       newArr.push(arr.slice(i, i + num))
    }
    return newArr
  }

页面实现

数据结构

    lightModeList: [
      {
        mode_name: '温馨',
        id: 0,
      },
      {
        mode_name: '浪漫',
        id: 1,
      },
      {
        mode_name: '起夜',
        id: 2,
      },
      {
        mode_name: '标准',
        id: 3,
      },      
      {
        mode_name: '睡眠',
        id: 4,
      }
    ]

由于我这里还有一个需求,就是图标数据后台不返回,需要H5本地保存并进行匹配,所以我这里还会用到另外一个方法进行图片字段的处理:

  /**
   * 给列表数据加上图标匹配
   * modeList:列表数据
   * 返回值:加上图标匹配的列表数据
   * */
  addIconToModeList(modeList) {
    let list = modeList
    for (let i = 0; i < list.length; i++) {
      list[i].icon = list[i].id + ''
      list[i].selectIcon = list[i].id + '_select'
    }
     return list
  },

数据转换

...
  this.newLightModeList = this.$threeInchCommon.addIconToModeList(this.lightModeList)
  this.newLightModeList = this.$threeInchCommon.changeArr(this.newLightModeList, 3)
...

页面显示

    <!-- 灯光模式 -->
    <div class="my-swipe">
      <div class="swipe-title">灯光模式</div>
      <van-swipe :lazy-render="true" indicator-color="#FFBD4F">
        <van-swipe-item v-for="(itemList, keyIndex) in newLightModeList" :key="keyIndex" class="swiper-item-box">
          <div v-for="(item,index) in itemList" :key="index" class="swiper-item" @click="selectMode(item)">
            <div class="swiper-item-img">
              <img :src="selectLightValue===item.id?getIconImg(item.selectIcon):getIconImg(item.icon">
              <img :src="selectLightValue===item.id?getIconImg(item.selectIcon):getIconImg(item.icon">
            </div>
            <div class="swiper-item-text">
              <p>{{ item.mode_name }}
            </div>
          </div>
        </van-swipe-item>
      </van-swipe>
    </div>

样式

.my-swipe{
  width: 100%;
  margin: 15px 0;
  background: #fff;
  padding: 10px 0;
  border-radius: 15px;
  .swipe-title{
    font-size: 16px;
    color: #333;
    padding: 10px 0;
    margin-left: 10px;
    font-weight: bold;
  }
  .swiper-item-box{
    display: flex;
    align-items:center;
    .swiper-item{
      display: flex;
      flex-direction: column;
      align-items:center;
      width: 33%;
      .swiper-item-img:active{
         scale: 1.1;
       }
      .swiper-item-img{
        width: 40px;
        height: 40px;
        img{
          width: 100%;
          height: 100%;
        }
      }
      .swiper-item-text{
        font-size: 14px;
        color: #666;
      }
    }
  }
}
       

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值