Vue学习笔记7.5 icon组件的分页

首先去Swiper.vue组件中吧Swiper标签复制过来用

    <swiper>
      <swiper-slide>
        <div class="icon">
          <div class="icon-img">
            <img class='icon-img-content' src='XXX'>
          </div>
          <p class="icon-desc">
          </p>
        </div>
      </swiper-slide>
    </swiper>

然后在组件中添加data数据: iconList数组 数据量自己加

<script>
export default {
  name: 'HomeIcons',
  data: () => {
    return {
      iconList: [{
        id: '001',
        imgUrl: 'http://img1.qunarzz.com/piao/fusion/1803/95/f3dd6c383aeb3b02.png',
        desc: '热门景点'
      }, {
        id: '002',
        imgUrl: 'http://img1.qunarzz.com/piao/fusion/1804/5a/13ceb38dcf262f02.png',
        desc: '一日游'
      }, {
        id: '003',
        imgUrl: 'http://img1.qunarzz.com/piao/fusion/1804/ff/fdf170ee89594b02.png',
        desc: '厦门必游'
      }, {
        id: '004',
        imgUrl: 'http://img1.qunarzz.com/piao/fusion/1803/97/02f5043b51b2102.png',
        desc: '鼓浪屿'
      }, {
        id: '005',
        imgUrl: 'http://img1.qunarzz.com/piao/fusion/1803/95/f3dd6c383aeb3b02.png',
        desc: '热门景点'
      }]
    }
  },

然后使用v-for循环

  <div class="icons">
    <swiper>
      <swiper-slide>
        <div class="icon" v-for="item of iconList" :key="item.id">
          <div class="icon-img">
            <img class='icon-img-content' :src='item.imgUrl'>
          </div>
          <p class="icon-desc">
            {{item.desc}}
          </p>
        </div>
      </swiper-slide>
    </swiper>
  </div>

这样写完之后,表面上看好像是OK了。但是 会有一个问题。超过8个的时候,第9个图标会再另起一行(被隐藏起来,但是F12那边是可以看得到位置是在第三行)而不是到第二个分页。

所以我们需要使用计算函数来手动进行分页

 computed: {
    pages () {
      const pages = []
      this.iconList.forEach((item, index) => {
        const page = Math.floor(index / 8)
        if (!pages[page]) {
          pages[page] = []
        }
        pages[page].push(item)
      })
      return pages
    }
  }

这样就可以在超过8个图标的时候自动分一页(第二个子数组)

然后在<swiper-slide>那边进行迭代了

  <div class="icons">
    <swiper>
      <swiper-slide v-for="(page, index) of pages" :key="index">
        <div class="icon" v-for="item of page" :key="item.id">
          <div class="icon-img">
            <img class='icon-img-content' :src='item.imgUrl'>
          </div>
          <p class="icon-desc">
            {{item.desc}}
          </p>
        </div>
      </swiper-slide>
    </swiper>
  </div>

 

还有最后一个问题就是如果图标的描述(desc)字数过多的解决办法。

情况是这样:(rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr)

那如果我希望在文字描述过长的时候使用...来替代,我要咋做?

我只需要在.icon-desc类中添加CSS样式:

  overflow: hidden
  white-space: nowrap
  text-overflow: ellipsis

如果这个样式在别的地方也想用到,但是又不想重复写代码

那就这样干:

新建src/assets/style/mixins.styl

然后新建函数,将此样式写进函数中:

ellipsis()
  overflow: hidden
  white-space: nowrap
  text-overflow: ellipsis

然后在.Icons.vue的<style>中导入该文件

  @import '~styles/mixins.styl'

然后在.icon-desc中添加ellipsis()函数即可

    .icon-desc
      position: absolute
      left: 0
      right: 0
      bottom: 0
      height: .44rem
      line-height: .44rem
      text-align: center
      color: $darkTextColor
      ellipsis()

效果图:

 

最后总结几个CSS样式和JS函数的作用:

js: forEach(function()):

迭代数组。每迭代一次就执行后面的函数。并且能够传值给后面的函数。

Math.floor(x)

返回小于或等于x的最大整数(简称向下取整)

比如 Math.floor(44.333)

返回44

Math.floor(56.99)

返回56

 

white-space: nowrap: 设定文本不换行,直到</br>

  text-overflow: ellipsis:当文本溢出包含元素时使用...来替代

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@凌晨三点半

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值