vue-seamless-scroll 数据的循环滚动 
之前在归档里,有写过此组件的具体安装引入和用法。这次因为这个组件,又遇到了些许问题,对此专门写一章,来归纳整理一下。
安装 
javascript
npm install vue-seamless-scroll --save用法 
html
<template>
    <vue-seamless-scroll
        class="scroll_list" 
        :data="listData" 
        :class-option="defaultOption"
    >
        <div style="height: 100%;">...滚动区域</div>
    </vue-seamless-scroll>
</template>
 
<script>
import vueSeamlessScroll from 'vue-seamless-scroll'  // vue2引入方式
import scroll from "vue-seamless-scroll/src"  // vue3引入方式
 
export default {
    // 监听属性 类似于data概念
    data() {
        //这⾥存放数据
        return {
            listData: [...], // 这里的数据,假如没有用在滚动里,可以是任意内容。
        };
    },
    components: {
        vueSeamlessScroll
    },
    computed: {
        defaultOption () {
            // 参数配置
            return {
                step: 0.2, // 数值越大速度滚动越快
                limitMoveNum: 2, // 开始无缝滚动的数据量 this.dataList.length
                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)
            }
        }
    },
}
</script>
<style lang="scss" scoped>
    /* 需要给组件设置高度,然后加上超出隐藏属性 */
    .scroll_list {
        height: 120px;
        overflow: hidden;
    }
</style>滚动内容实时更新 
问题 
在写这个之前,由于之前的写法是直接放入了 store 里的数据,点击事件触发时,运用状态储存管理更新 store。但是遇到一个问题,滚动的内容无法实时更新,又或者是没有把原来的数据覆盖,而是直接接入滚动。
解决方法 
这里,我通过监听 store 里的值,如果变化,则把新的值赋值给 data 里的数据,然后调用 vue-seamless-scroll 组件内部的 reset() 方法
javascript
export default {
    data() {
        return {
            detailInfo: this.$store.state.xxx // 把状态管理的初始值先赋值,让页面加载时,滚动初始数据
        }
    },
    computed: {
        // 利用计算属性,方便后面监听
		introductData() {
			return this.$store.state.xxx
		},
    },
    watch: {
        // 监听 store 里的数据变化
		introductData (newVal, oldVal) {
			if(newVal) {
				this.detailInfo = newVal;
                // 调用 vue-seamless-scroll 组件内部的方法,来更新原有数据
				this.$nextTick(() => {
					this.$refs.vueSeamlessScroll.reset()
				})
			}
		}
	},
}循环滚动时,点击事件无效 
写大屏的时候,因为侧边会有滚动数据,需要对每一条滚动数据给予点击事件。点击时,地图上对应坐标点会弹出对应窗口,显示所点击数据的详细信息。在写点击事件时,就遇到这样的问题:
问题 
当我点击数据的时候,会出现点击事件无效的情况。只有等下一次循环时,新循环出来的数据才能点击。这样就会造成用户会有一部分数据,出现点击不了的情况,用户体验感差。
解决方法 
我们把点击事件移到组件的外层,通过 for循环中 每一个 ClassName 类名来获取Dom元素的数据
关键:
class="scrollItem":data="JSON.stringify(item)"
html
<div @click="handleClick($event)">
    <vue-seamless-scroll
        :data="orderList"
        :class-option="classOption"
        :style="{'height': `${height}px !important`}"
        class="warp"
    >
        <div
            v-for="(item,index) in orderList"
            :key="index"
            class="scrollItem"
            :data="JSON.stringify(item)"
        >
            <div>{{ item.name }}</div>
        </div>
    </vue-seamless-scroll>
</div>javascript
handleClick(e) {
    /** --- start ---*/ 
    const path = e.path || (e.composedPath && e.composedPath());
    // 自定义类名 scrollItem,把这个替换掉即可
    let target = path.filter((r) => /scrollItem/.test(r.className));
    if (target.length) target = target[0];
    else return;
    // 获取到的单项数据详情
    const data = JSON.parse(target.getAttribute("data")); 
    /** --- end --- */
    console.log(data)
},