vue 列表无限滚动列表,循环完自动切换tab

记录一下大屏常用的滚动组件 vue-seamless-scroll  以及滚动完自动切换tab效果。

1.下载vue-seamless-scroll插件

npm install vue-seamless-scroll --save

2.页面使用

<vueSeamlessScroll @ScrollEnd="changeScroll" :data="nowlist" :class-option="defaultOption" class="fxsfdw_list">
        <div v-for="(item, index) in nowlist" :key="index">
          <div class="ttflex">
            <div class="items w1">{{ item.name }}</div>
            <div class="items w2">{{ item.age }}</div>
            <div class="items w3">{{ item.class }}</div>
          </div>
        </div>
        //循环完一次增加间隔
        <div style="height: 20px;"></div>
</vueSeamlessScroll>
<script>
import vueSeamlessScroll from "vue-seamless-scroll"
export default {
  components: {
    vueSeamlessScroll
  },
}
</script>

3.监听列表滚动完毕执行定时任务

需要用到插件的一个方法 @ScrollEnd 官网没有介绍,这个方法是列表滚动完毕一次就会执行。

  methods: {
    jumptype() {
      clearTimeout(this.timeOut)
      this.active = this.active + 1
      console.log(this.active);
      if (this.active == 3) {
        this.active = 0
        this.nowlist = this.userInfo.list1
      } else if (this.active == 1) {
        this.nowlist = this.userInfo.list2
      } else if (this.active == 2) {
        this.nowlist = this.userInfo.list3
      }
      if (this.nowlist.length < 4) {
        this.timeOut = setTimeout(() => {
          this.jumptype()
        }, 3000);
      }
    }, 
    //监听列表滚动完毕
    changeScroll() {
      if (this.nowlist.length) {
          this.jumptype()
      }
    }
  },

4.完整测试代码

注意滚动列表最好要定义高度,高度与你设置limitMoveNum 属性相关联否则列表滚动会有间隔!

<template>
  <div>
    <div class="tit_flex">
      <div class="tit_item" :class="active == index ? 'activeitem' : ''" v-for="(item, index) in classList" :key="index"
        @click="changeType(item, index)">
        {{ item.name }}
      </div>
    </div>
    <div class="content">
      <div class="tflex">
        <div class="items w1">姓名</div>
        <div class="items w2">年龄</div>
        <div class="items w3">班级</div>
      </div>
      <!-- 注意滚动列表最好要定义高度,高度与你设置limitMoveNum 属性相关联否则列表滚动会有间隔  !!!!!-->
      <vueSeamlessScroll @ScrollEnd="changeScroll" :data="nowlist" :class-option="defaultOption" class="fxsfdw_list">
        <div v-for="(item, index) in nowlist" :key="index">
          <div class="ttflex">
            <div class="items w1">{{ item.name }}</div>
            <div class="items w2">{{ item.age }}</div>
            <div class="items w3">{{ item.class }}</div>
          </div>
        </div>
        <div style="height: 20px;"></div>
      </vueSeamlessScroll>
    </div>
  </div>
</template>

<script>
import vueSeamlessScroll from "vue-seamless-scroll"
export default {
  components: {
    vueSeamlessScroll
  },
  name: 'TestSa',
  data() {
    return {
      classList: [
        {
          id: 1,
          name: '一班'
        },
        {
          id: 2,
          name: '二班'
        },
        {
          id: 3,
          name: '三班'
        }
      ],
      active: 0,
      userInfo: {
        list1: [
          {
            name: '张三',
            age: 20,
            class: '一班'
          },
          {
            name: '张三',
            age: 120,
            class: '一班'
          },
          {
            name: '李四',
            age: 9,
            class: '一班'
          },
          {
            name: '王五',
            age: 1,
            class: '一班'
          },
          {
            name: '二狗',
            age: 22,
            class: '一班'
          },
          {
            name: '阿萨德',
            age: 20,
            class: '一班'
          }
        ],
        list2: [
          {
            name: '张三',
            age: 20,
            class: '二班'
          },
          {
            name: '张三',
            age: 120,
            class: '二班'
          },
          {
            name: '李四',
            age: 9,
            class: '二班'
          },
          {
            name: '王五',
            age: 1,
            class: '二班'
          },
          {
            name: '二狗',
            age: 22,
            class: '二班'
          },
          {
            name: '阿萨德',
            age: 20,
            class: '二班'
          }
        ],
        list3: [
          {
            name: '张三',
            age: 20,
            class: '三班'
          },
          {
            name: '张三',
            age: 120,
            class: '三班'
          },
          {
            name: '李四',
            age: 9,
            class: '三班'
          },
          {
            name: '王五',
            age: 1,
            class: '三班'
          },
          {
            name: '二狗',
            age: 22,
            class: '三班'
          },
          {
            name: '阿萨德',
            age: 20,
            class: '三班'
          }
        ]
      },
      nowlist: [],
      timeOut: null
    }
  },
  computed: {
    defaultOption() {
      return {
        step: 0.4, // 数值越大速度滚动越快
        hoverStop: true, // 是否开启鼠标悬停stop
        direction: 1, // 0向下 1向上 2向左 3向右
        openWatch: true, // 开启数据实时监控刷新dom
        singleHeight: 0, // 单步运动停止的高度(默认值0是无缝不停止的滚动)direction => 0/1                                
        singleWidth: 0, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) direction => 2/3
        waitTime: 1000, // 单步运动停止的时间(默认值1000ms)
        limitMoveNum: 4 // 多少条开始滚动
      }
    },
  },
  mounted() {
    this.nowlist = this.userInfo.list1

  },
  methods: {
    changeType(item, index) {
      console.log(item, index);
      this.active = index
      if (index == 0) {
        this.nowlist = this.userInfo.list1
      } else if (index == 1) {
        this.nowlist = this.userInfo.list2
      } else {
        this.nowlist = this.userInfo.list3
      }

    },
    jumptype() {
      clearTimeout(this.timeOut)
      this.active = this.active + 1
      console.log(this.active);
      if (this.active == 3) {
        this.active = 0
        this.nowlist = this.userInfo.list1
      } else if (this.active == 1) {
        this.nowlist = this.userInfo.list2
      } else if (this.active == 2) {
        this.nowlist = this.userInfo.list3
      }
      if (this.nowlist.length < 4) {
        this.timeOut = setTimeout(() => {
          this.jumptype()
        }, 3000);
      }
    },
    changeScroll() {
      if (this.nowlist.length) {
          this.jumptype()
      }
    }
  },
}
</script>
<style scoped>
.tit_flex {
  width: 300px;
  display: flex;
  justify-content: space-between;
  border: 1px solid #eee;
  height: 38px;
  align-items: center;
}

.tit_item {
  width: 30%;
  cursor: pointer;
}

.activeitem {
  color: red;
}

.content {
  width: 300px;
  border: 1px solid #eee;
}

.tflex {
  display: flex;
  justify-content: space-between;
  background: #eee;
}

.tflex .items {}

.w1 {
  width: 30%;
}

.w2 {
  width: 30%;
}

.w3 {
  width: 30%;
}

.fxsfdw_list {
  overflow: hidden;
  height: 200px;
}

.ttflex {
  display: flex;
  justify-content: space-between;
  padding: 6px 4px;
}
</style>

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值