最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue實現(xiàn)圖片拖動排序

 更新時間:2021年10月21日 17:02:17   作者:沉末  
這篇文章主要為大家詳細(xì)介紹了vue實現(xiàn)圖片拖動排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了vue實現(xiàn)圖片拖動排序的具體代碼,供大家參考,具體內(nèi)容如下

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

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

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

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

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

 <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:識別需要拖動的元素,保存到狀態(tài)中,供拖動過程中dragover的綁定事件使用。 

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

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

onDragOver(event){
            console.log('drag move')
            event.preventDefault();
            let target = event.target;
                //因為dragover會發(fā)生在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會發(fā)生在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>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue項目通過a標(biāo)簽下載圖片至zip包的示例代碼

    vue項目通過a標(biāo)簽下載圖片至zip包的示例代碼

    在vue項目中,將圖片下載可使用流的形式,下載成單個圖片,或者將多個圖片下載至zip包,本文就是介紹使用a標(biāo)簽下載圖片的用法,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價值,需要的朋友可以參考下
    2023-10-10
  • vue中虛擬DOM與Diff算法知識精講

    vue中虛擬DOM與Diff算法知識精講

    這篇文章主要為大家介紹了vue中虛擬DOM與Diff算法知識的圖文精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • 探索Vue如何高效構(gòu)建可復(fù)用組件

    探索Vue如何高效構(gòu)建可復(fù)用組件

    Vue.js作為現(xiàn)代前端開發(fā)中的佼佼者,其組件系統(tǒng)是構(gòu)建高效、靈活和可擴展用戶界面的關(guān)鍵,本文帶大家深度探索?Vue.js?組件的核心奧義,感興趣的小伙伴可以了解下
    2024-12-12
  • Vue實現(xiàn)導(dǎo)航欄點擊當(dāng)前標(biāo)簽變色功能

    Vue實現(xiàn)導(dǎo)航欄點擊當(dāng)前標(biāo)簽變色功能

    這篇文章主要為大家詳細(xì)介紹了Vue實現(xiàn)導(dǎo)航欄點擊當(dāng)前標(biāo)簽變色功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • vue3常用響應(yīng)式對象的api,你全用過了嗎

    vue3常用響應(yīng)式對象的api,你全用過了嗎

    這篇文章主要給大家介紹了關(guān)于vue3常用響應(yīng)式對象api的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用vue3具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-02-02
  • 詳解el-table表頭文字換行的三種方式

    詳解el-table表頭文字換行的三種方式

    本文主要介紹了el-table表頭文字換行的三種方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • element-ui中dialog彈窗關(guān)閉按鈕失效的解決

    element-ui中dialog彈窗關(guān)閉按鈕失效的解決

    這篇文章主要介紹了element-ui中dialog彈窗關(guān)閉按鈕失效的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • elementUI?el-table二次封裝的詳細(xì)實例

    elementUI?el-table二次封裝的詳細(xì)實例

    在項目中會多次使用表格展示數(shù)據(jù),不對這個table進(jìn)行二次封裝成我們自己想要的,重復(fù)的代碼量的工作會比較大,下面這篇文章主要給大家介紹了關(guān)于elementUI?el-table二次封裝的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • Vue框架+Element-ui(el-upload組件)使用http-request方法上傳文件并顯示文件上傳進(jìn)度功能

    Vue框架+Element-ui(el-upload組件)使用http-request方法上傳文件并顯示文件上傳進(jìn)度功能

    這篇文章主要介紹了Vue框架+Element-ui(el-upload組件)使用http-request方法上傳文件并顯示文件上傳進(jìn)度功能,本通過實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • mpvue跳轉(zhuǎn)頁面及注意事項

    mpvue跳轉(zhuǎn)頁面及注意事項

    這篇文章主要介紹了mpvue跳轉(zhuǎn)頁面及注意事項的相關(guān)資料,需要的朋友可以參考下
    2018-08-08

最新評論

岚皋县| 湘西| 腾冲县| 大田县| 资兴市| 台山市| 商丘市| 白沙| 萨迦县| 扶沟县| 云林县| 平塘县| 武乡县| 肃南| 延津县| 观塘区| 游戏| 宁陵县| 浪卡子县| 汝州市| 横峰县| 宣威市| 丰原市| 滦南县| 磴口县| 临泉县| 甘洛县| 唐山市| 石台县| 奎屯市| 开远市| 杭州市| 根河市| 康平县| 三门峡市| 肥西县| 沙湾县| 台南市| 延安市| 吉木乃县| 图木舒克市|