首頁 > 軟體

Vue拖拽排序元件Vue-Slicksort解讀

2023-03-11 06:01:01

一、效果圖

二、安裝元件

npm i vue-slicksort -S

三、使用元件

<div class="maintenance_img mt50 mb50 pl20 pr20" style="font-size: 16px;font-weight: 600;position: relative;">
    <!-- 拖拽 -->
    <SlickList
        :lockToContainerEdges="true"
        lockAxis="x"
        axis="x"
        v-model="maintenanceData.img_list"
        @input="getChangeLists"
        style="display: flex"
        >
        <SlickItem style="z-index: 10000" v-for="(item, index) in maintenanceData.img_list" :index="index" :key="index">
            <div class="maintenance_top">
                <img :src="item" @mouseover="changeMask(index)" @mouseout="changeMask(index)" alt="">
            </div>
        </SlickItem>
    </SlickList>
    <div style="display: flex;position: absolute;bottom: -15px;">
        <div class="maintenance_icon" v-for="(item, index) in maintenanceData.img_list" :key="index">
            <div class="img_bg" :ref="'mask' + index" @mouseover="changeMask(index)" @mouseout="changeMask(index)">
                <Icon @click.stop="isImgShow = true;bigImg = item" class="pointer" size="20" color="#000000" type="md-search" />
                <Icon @click.stop="downloadImg(item)" class="pointer" size="20" color="#000000" type="md-download" />
                <Icon @click.stop="movingItems(4, index)" class="pointer" size="20" color="#000000" type="md-trash" />
            </div>
        </div>
    </div>
    <!-- 600*330 -->
    <div class="add-img" v-if="maintenanceData.img_list.length<5">
        <span>
            <Icon type="md-add" size="30"></Icon>
        </span>
        <p>新增圖片</p>
        <input @change="uploadImegs($event, 1)" type="file" accept="image/*" />
    </div>
</div>
    import { SlickList, SlickItem } from "vue-slicksort";
    export default {
        components:{
            SlickItem,
            SlickList
        },
        data() {
            return {
                maintenanceData: {
                    img_list: [], //圖片
                },
            }
        },
        created() {
            
        },
        methods: {
            getChangeLists(vals) {
                // 拖拽完成後返回新的排序陣列
                console.log(vals);
            },
        },
    }
.maintenance_top {
    display: flex;
    z-index: 10000;
}
.maintenance_top {
    width: 140px;
    height: 78px;
    border: 1px dashed #ccc;
    border-radius: 6px;
    display: flex;
    align-items: center;
    position: relative;
    margin-right: 15px;
}
.maintenance_top > img{
    max-width: 138px;
    max-height: 138px;
    border-radius: 6px;
}
.maintenance_icon{
    width: 140px;
    display: flex;
    align-items: center;
    position: relative;
    margin-right: 15px;
}
.maintenance_img{
    display: flex;
}
.maintenance_img>div>div{
    z-index: 10000;
}
.maintenance_img > .add-img{
    display: block;
    width: 140px;
    height: 78px;
    border-radius: 6px;
} 
.img_bg{
    width: 100%;
    height: 40px;
    position: absolute;
    bottom: -20px;
    left: 0;
    border-radius: 6px;
    display: none;
    align-items: center;
    justify-content: space-evenly;
}

四、元件引數

名稱型別預設值說明
valueArray-列表的內容
axisStringy列表元素可以被橫向拖拽,縱向拖拽還是網格拖拽。用x,y,xy來表示
lockAxisArray-用於排序時在座標系中鎖定元素的移動
helperClassString-helper的自定義樣式類
transitionDurationNumber300元素移動動畫的持續時間
pressDelayNumber0如果需要當元素被按下一段時間再允許拖拽,可以設定這個屬性
pressThresholdNumber5移動允許被忽略的閾值,單位是畫素
distanceNumber0如果需要在拖拽出一定距離之後才被識別為正在拖拽的元素,可以設定這個屬性
useDragHandleBooleanfalse如果使用HandleDirective,設定為true
useWindowAsScrollContainerBooleanfalse是否設定window為可捲動的容器
hideSortableGhostBooleantrue是否自動隱藏ghost元素
lockToContainerEdgesBooleanfalse是否對正在拖拽的元素鎖定容器邊緣
lockOffsetString50%對正在拖拽的元素鎖定容器邊緣的偏移量
shouldCancelStartFunction-在拖拽開始前這個方法將被呼叫
getHelperDimensionsFunction-可選方法({node, index, collection}),用於返回SortableHelper的計算尺寸

五、元件方法

名稱引數說明
sortStartevent, node, index, collection當拖拽開始時觸發
sortMoveevent當拖拽時滑鼠移動時觸發
sortEndevent, newIndex, oldIndex, collection當拖拽結束時觸發
inputnewList當拖拽結束後產生新的列表時觸發

HandleDirective

v-handle 指令在可拖動元素內部使用。(即用了這個指令,可以讓拖動只在元素的某個位置生效)

Container 必須由 :useDragHandle 屬性,且設定為 true 時才能正常工作。

這裡有關於此的一個簡單元素的例子:

<template>
	<li class="list-item">
	    <!-- 拖動只在 span 元素上生效 -->
	    <span v-handle class="handle"></span>
	    {{item.value}}
	</li>
</template>

<script>
    import { ElementMixin, HandleDirective } from 'vue-slicksort';

    export default {
        mixins: [ElementMixin],
        directives: { handle: HandleDirective },
    };
</script>

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com