vue-seamless-scroll实现循环滚动列表,并实现列表点击事件

本文展示了如何在Vue.js项目中安装并使用vue-seamless-scroll插件来创建一个无缝滚动列表。通过设置组件属性和监听数据变化,实现了数据实时更新和滚动效果。同时,详细定义了样式以实现特定的视觉效果,并提供了点击事件处理以响应用户交互。
摘要由CSDN通过智能技术生成
  1. 安装插件npm install vue-seamless-scroll --save
  2. 使用
<template>
  <div class="scorllBox">
    <div class="scrollnameList">
      <p v-for="(item, index) in scorllBoxListName" :key="index">{{ item }}</p>
    </div>
    <div @click="handleClick($event)">
      <vue-seamless-scroll :data="data"
                           class="seamless-warp"
                           :class-option="classOption"
                           :style="{ height: scorllHeight + 'px' }"
                           v-if="data.length > 0">
        <ul class="sm-li"
            v-for="(item, idx) in data"
            :key="idx"
            :style="{ color: item.state == '未处理' ? '#ffd16f' : '#ff' }">
          <div class="scroll_item">
            <span :data-dept="JSON.stringify(item)">{{ item.name }}</span>
            <span :data-dept="JSON.stringify(item)">{{ item.time }}</span>
            <span :data-dept="JSON.stringify(item)">{{ item.area }}</span>
            <span class="scroll_item_state">
              <span
                  class="scroll_item_state_text"
                  :data-dept="JSON.stringify(item)"
                  :class="{
                  colorOrange: !(
                    item.state === '已处理' || item.state === '进入小区'
                  )
                }"
              >
                {{ item.state }}</span
              >
            </span>
          </div>
        </ul>
      </vue-seamless-scroll>
    </div>
  </div>

</template>

<script>
//循环滚动
import vueSeamlessScroll from "vue-seamless-scroll";

export default {
  name: "ScorllBox",
  components: {
    vueSeamlessScroll
  },
  props: {
    scorllBoxListName: {
      default: ()=>{
        return [];
      }
    },
    scorllHeight: {
      default: 180
    },
    scorllBoxList: {
      default: ()=>{
        return [];
      }
    }
  },
  //计算属性,获得可以操作的swiper对象
  computed: {
    classOption () {
      return {
        step: 0.8, // 数值越大速度滚动越快
        limitMoveNum: 5, // 开始无缝滚动的数据量 this.dataList.length
        hoverStop: true, // 是否开启鼠标悬停stop
        direction: 1, // 0向下 1向上 2向左 3向右
        openWatch: true, // 开启数据实时监控刷新dom
        singleHeight: 30, // 单步运动停止的高度(默认值0是无缝不停止的滚动) direction => 0/1
        singleWidth: 0, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) direction => 2/3
        waitTime: 1000 // 单步运动停止的时间(默认值1000ms)
      };
    }
  },
  data () {
    return {
      data: [],
      curItem: {}
    };
  },
  watch: {
    scorllBoxList: {
      //深度监听,可监听到对象、数组的变化
      handler () {
        this.data = [];
        setTimeout(()=>{
          this.data = this.scorllBoxList;
        }, 500);
      },
      deep: true
    }
  },
  mounted () {
    this.data = this.scorllBoxList;
  },
  methods: {
    handleClick (event) {
      //防止重复点击某一条数据
      if(event.target.dataset.dept && JSON.stringify(this.curItem) !== event.target.dataset.dept)				 			      	{
      //获取点击的list对象
        let item = JSON.parse(event.target.dataset.dept);
        this.curItem = item;
        this.$emit("scroll_itemClick", item);
      }
    }
  }
};
</script>

<style lang="less" scoped>
.scorllBox {
  overflow: hidden;
  margin: 0 10px;
}

.seamless-warp {
  width: 100%;
  color: #fff;
  overflow: hidden;

  .scroll_item {
    border-bottom: 1px solid transparent;
    border-image: url("../../assets/img/home/table-border.png") 1;
    display: flex;
    justify-content: space-evenly;
    text-align: left;

    cursor: pointer;
    line-height: 30px;
    height: 30px;
    box-sizing: border-box;
    align-items: center;

    span {
      flex: 1;

      &:first-of-type {
        padding-left: 10px;
      }
    }

    .scroll_item_state {
      display: flex;
      align-items: center;
      padding: 0;
      font-size: 12px;

      .scroll_item_state_text {
        border: 1px solid #4dffe4;
        color: #4dffe4;
        height: 18px;
        line-height: 18px;
        flex: 0 0 60px;
        background-color: #1861617c;
        text-align: center;
        padding: 0;

        &.colorOrange {
          color: #ffd16f;
          border-color: #ffd16f;
          background-color: #4b3b0e9f;
        }
      }
    }
  }
}

.scrollnameList {
  color: #fff;
  height: 30px;
  display: flex;
  justify-content: space-evenly;
  border-top: 1px solid transparent;
  border-bottom: 1px solid transparent;
  border-image: url("../../assets/img/home/table-border.png") 1;
  align-items: center;

  p {
    flex: 1;
    color: #4dffe4;
    font-weight: bold;
    text-align: left;

    &:first-of-type {
      padding-left: 10px;
    }
  }
}
</style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值