vue3容器内容区域横向推拽滑动横向滚动条组件

比较实用的的组件,横向溢出内容拖拽内容区左右滑动内容

引入组件直接放入默认插槽即可

<drag-scroll-box>

       <div> 内容区</div>

</drag-scroll-box>

<template>
    <!-- 通用 容器内容区域内横向拖拽滑动横向滚动条组件 -->
    <div 
        class="drag-scroll-wrap" 
        >
        <div class="drag-scroll-box" ref="dragScrollBox">
            <slot></slot>
        </div>
        <div 
            class="mask" 
            @mousedown.stop="mousedown" 
            @mousemove.stop="mousemove" 
            @mouseup.stop="mouseup"></div>
    </div>
</template>

<script setup>
import { reactive, ref, computed, onMounted, nextTick } from "vue"
const dragScrollBox = ref(null)
const isDrag = ref(false)
let startXY = reactive([])
const mousedown = (event) => {
    isDrag.value = true
    startXY = [event.x, event.y]
}
const mousemove = (event) => {
    throttle((event) => {
        if (isDrag.value) {
            // 拖拽滑动开始
            let speadX = startXY[0] - event.x
            if (speadX >= 0) {
                if ((dragScrollBox.value.scrollLeft + dragScrollBox.value.offsetWidth + speadX) >= dragScrollBox.value.scrollWidth) {
                    dragScrollBox.value.scrollTo(dragScrollBox.value.scrollWidth - dragScrollBox.value.offsetWidth, 0)
                } else {
                    dragScrollBox.value.scrollTo(dragScrollBox.value.scrollLeft + speadX, 0)
                }
            } else {
                if ((dragScrollBox.value.scrollLeft + speadX) <= 0) {
                    dragScrollBox.value.scrollTo(0, 0)
                } else {
                    dragScrollBox.value.scrollTo(dragScrollBox.value.scrollLeft + speadX, 0)
                }
            }
            startXY = [event.x, event.y]
        }
    }, event, 50)
}
const mouseup = (event) => {
    isDrag.value = false
}

const valid = ref(true);
const throttle = (fn, event, delay) => {
    /* 一开始就触发---后续每隔delay时间内只触发一次 */
    if (valid.value) {
        valid.value = false; // 关闭阀门
        // 如果阀门已经打开,就继续往下
        setTimeout(() => {
            fn(event); // 定时器结束后执行
            valid.value = true; // 执行完成后打开阀门
        }, delay);
    }
}
</script>

<style lang="scss" scoped>
.drag-scroll-wrap{
    position: relative;
    overflow: hidden;
    .drag-scroll-box{
        width: 100%;
        overflow: auto;
    }
    .mask{
        position: absolute;
        bottom: 16px;
        left: 0;
        right: 0;
        top: 0;
        z-index: 99999;
        cursor: grab;
        &:active{
            cursor: grabbing;
        }
    }
}
</style>

效果:

@handsontable/vue3插件的表格滑动横向滚动条时可能会触发表格的重新渲染,这可能会导致DOM结构的重新渲染。为了避免这种情况,你可以尝试使用 `shouldComponentUpdate()` 方法来控制组件的重新渲染。 在 @handsontable/vue3 插件中,你可以在 `HotTable` 组件中定义 `shouldComponentUpdate()` 方法,该方法将返回一个布尔值,表示组件是否应该重新渲染。如果你希望阻止组件的重新渲染,只需在该方法中返回 `false` 即可。 以下是一个示例: ```javascript <template> <HotTable :data="data" :colHeaders="colHeaders" :columns="columns" :options="options" :settings="settings" :beforeChange="beforeChange" :afterChange="afterChange" :stretchH="stretchH" :className="className" :licenseKey="licenseKey" :shouldComponentUpdate="shouldComponentUpdate" /> </template> <script> import { HotTable } from '@handsontable/vue3'; export default { components: { HotTable, }, data() { return { data: [['']], colHeaders: true, columns: [{type: 'text'}], options: { // ... }, settings: { // ... }, stretchH: 'all', className: 'htCenter', licenseKey: 'non-commercial-and-evaluation', shouldComponentUpdate: function(nextProps, nextState) { // 在这里添加你的逻辑,返回 false 阻止组件的重新渲染 return true; }, }; }, methods: { beforeChange(changes, source) { // ... }, afterChange(changes, source) { // ... }, }, }; </script> ``` 在上面的示例中,我们在 `HotTable` 组件中添加了 `shouldComponentUpdate` 属性,并定义了一个函数来控制组件的重新渲染。在这个函数中,你可以添加你的逻辑来判断是否需要重新渲染组件。如果你希望阻止组件的重新渲染,只需在该函数中返回 `false` 即可。 希望这可以帮助你解决你的问题!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值