亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用vue實現圖片拖動排序

發布時間:2021-10-21 17:08:03 來源:億速云 閱讀:178 作者:iii 欄目:開發技術

本篇內容介紹了“怎么用vue實現圖片拖動排序”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

具體內容如下

原理:現有一個圖片的列表,拖動其中一個圖片(觸發dragstart),當拖動的圖片移動到其他圖片的位置(觸發dragover),則將拖動的圖片從原位置移動到該位置(觸發dragend)。

dragstart:當用戶開始拖動一個元素或者一個選擇文本的時候 dragstart 事件就會觸發。

dragover:當元素或者選擇的文本被拖拽到一個有效的放置目標上時,觸發 dragover 事件(每幾百毫秒觸發一次)。

dragend:拖放事件在拖放操作結束時觸發。(我們這里可以不用)

(1)圖片列表HTML結構。給需要拖動的元素添加屬性draggable。這里要注意:模板for循環的key值需要唯一,因為vue在渲染的時候會采用就地復用的方式,如果key值唯一,重新排序后渲染的列表節點不會復用,這樣可以避免一些問題。(我們在插入的時候會根據序號向數組中插入某個數據)

 <ul class="drag-container" 
            @dragstart="onDragStart"
            @dragover="onDragOver"
            @dragend="onDragEnd"
            ref="imgList">
            <li 
            v-for="(item,idx) in list" 
            :key='item.path'
            class="drag-list" 
            draggable="true" 
            >
                <img :src="item.path" alt="" />
            </li>
</ul>

(2)事件: dragstart、dragover綁定事件onDragStart、onDragOver

onDragStart:識別需要拖動的元素,保存到狀態中,供拖動過程中dragover的綁定事件使用。 

onDragStart(event){
            console.log("start");
            this.draging = event.target;
        },

onDragOver:拖動過程中處于有效目標上的時候觸發事件,識別的是目標元素,而不是拖動的元素。首先識別目標元素是否是我們需要的目標元素,我們例子判斷是否是li元素,并判斷圖片是否與拖動的相同,則進行插入拖動元素的操作。
識別拖動元素與目標元素的位置序號,將拖動元素插入到目標元素前,再將拖動元素原位置的數據刪除,在vue中,則只需要進行數據操作即可。

onDragOver(event){
            console.log('drag move')
            event.preventDefault();
            let target = event.target;
                //因為dragover會發生在ul上,所以要判斷是不是li
            if (target.nodeName === "LI" && 
                target.childNodes[0].src !== this.draging.childNodes[0].src) {
                let idx_drag = this._index(this.draging)
                let idx_target = this._index(target)
                let _list = this.list
                let _drag = this.list[idx_drag]
                if(idx_drag>idx_target){
                    _list.splice(idx_target,0,_list[idx_drag]);
                    _list.splice(idx_drag+1,1)
                }else{
                    _list.splice(idx_target+1,0,_list[idx_drag]);
                    _list.splice(idx_drag,1)
                }
                console.log(_list[0].path)
                this.$emit("change", _list)
            }
        },

完整代碼如下:

<template>
    <div class="image-list" v-if="list && list.length">
        <ul class="drag-container" 
        @dragstart="onDragStart"
        @dragover="onDragOver"
        @dragend="onDragEnd"
        ref="imgList">
            <li 
            v-for="(item,idx) in list" 
            :key='item.path'
            class="drag-list" 
            draggable="true" 
            >
                <img :src="item.path" alt="" />
            </li>
        </ul>
    </div>
</template>
<script>
export default {
    name:"drag-image-list",
    props:{
        list: Array,
    },
    data(){
        return {
            draging:null,//被拖拽的對象
        }
    },
    methods:{
        onDragStart(event){
            console.log("start");
            this.draging = event.target;
        },   
        onDragOver(event){
            console.log('drag move')
            event.preventDefault();
            let target = event.target;
                //因為dragover會發生在ul上,所以要判斷是不是li
            if (target.nodeName === "LI" && target.childNodes[0].src !== this.draging.childNodes[0].src) {
                let idx_drag = this._index(this.draging)
                let idx_target = this._index(target)
                let _list = this.list
                let _drag = this.list[idx_drag]
                if(idx_drag>idx_target){
                    _list.splice(idx_target,0,_list[idx_drag]);
                    _list.splice(idx_drag+1,1)
                }else{
                    _list.splice(idx_target+1,0,_list[idx_drag]);
                    _list.splice(idx_drag,1)
                }
                console.log(_list[0].path)
            }
        },
        onDragEnd(event){
            console.log('end event')
        },
        _index(el){
            var index = 0;
            if (!el || !el.parentNode) {
                return -1;
            }
            while (el && (el = el.previousElementSibling)) {
                index++;
            }
            return index;
        },
    }
}
</script>

“怎么用vue實現圖片拖動排序”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

vue
AI

辉县市| 海安县| 吉林省| 高清| 汾西县| 黄山市| 汶上县| 富阳市| 铁岭市| 刚察县| 钟山县| 霍林郭勒市| 北票市| 南宁市| 密云县| 蒙城县| 柯坪县| 南汇区| 兰考县| 临沧市| 贵南县| 额尔古纳市| 凤阳县| 兰溪市| 柘荣县| 福鼎市| 扬中市| 明水县| 乡宁县| 房产| 德钦县| 陇川县| 会理县| 凭祥市| 龙口市| 曲沃县| 海兴县| 凤山市| 溆浦县| 鄂托克旗| 扎鲁特旗|