欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue實(shí)現(xiàn)圖片拖動(dòng)排序

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

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

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

dragstart:當(dāng)用戶開(kāi)始拖動(dòng)一個(gè)元素或者一個(gè)選擇文本的時(shí)候 dragstart 事件就會(huì)觸發(fā)。

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

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

(1)圖片列表HTML結(jié)構(gòu)。給需要拖動(dòng)的元素添加屬性draggable。這里要注意:模板for循環(huán)的key值需要唯一,因?yàn)関ue在渲染的時(shí)候會(huì)采用就地復(fù)用的方式,如果key值唯一,重新排序后渲染的列表節(jié)點(diǎn)不會(huì)復(fù)用,這樣可以避免一些問(wèn)題。(我們?cè)诓迦氲臅r(shí)候會(huì)根據(jù)序號(hào)向數(shù)組中插入某個(gè)數(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:識(shí)別需要拖動(dòng)的元素,保存到狀態(tài)中,供拖動(dòng)過(guò)程中dragover的綁定事件使用。 

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

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

onDragOver(event){
            console.log('drag move')
            event.preventDefault();
            let target = event.target;
                //因?yàn)閐ragover會(huì)發(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,//被拖拽的對(duì)象
        }
    },
    methods:{
        onDragStart(event){
            console.log("start");
            this.draging = event.target;
        },   
        onDragOver(event){
            console.log('drag move')
            event.preventDefault();
            let target = event.target;
                //因?yàn)閐ragover會(huì)發(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>

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

相關(guān)文章

  • 什么是Vue.js框架 為什么選擇它?(第一課)

    什么是Vue.js框架 為什么選擇它?(第一課)

    Vue.js框架是什么,為什么要選擇它?這篇文章為大家介紹目前前端技術(shù)使用的趨勢(shì),以及Vue.js的優(yōu)點(diǎn)和適用場(chǎng)景等,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 解決vue里a標(biāo)簽值解析變量,跳轉(zhuǎn)頁(yè)面,前面加默認(rèn)域名端口的問(wèn)題

    解決vue里a標(biāo)簽值解析變量,跳轉(zhuǎn)頁(yè)面,前面加默認(rèn)域名端口的問(wèn)題

    這篇文章主要介紹了解決vue里a標(biāo)簽值解析變量,跳轉(zhuǎn)頁(yè)面,前面加默認(rèn)域名端口的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • Vue-Element-Admin前端接入SSO的方法步驟

    Vue-Element-Admin前端接入SSO的方法步驟

    本文主要介紹了Vue-Element-Admin前端接入SSO的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • vue打包項(xiàng)目版本號(hào)自加的操作步驟

    vue打包項(xiàng)目版本號(hào)自加的操作步驟

    項(xiàng)目每次打包后都需要改動(dòng)項(xiàng)目版本號(hào),這個(gè)改動(dòng)每次都需要在package.json中修改version,比較麻煩,到底有沒(méi)有一種打包后版本號(hào)自加的辦法,這篇文章主要介紹了vue打包項(xiàng)目版本號(hào)自加的步驟,需要的朋友可以參考下
    2022-09-09
  • 深入淺析Vue.js計(jì)算屬性和偵聽(tīng)器

    深入淺析Vue.js計(jì)算屬性和偵聽(tīng)器

    這篇文章主要介紹了Vue.js計(jì)算屬性和偵聽(tīng)器的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-05-05
  • vue中的文本空格占位符說(shuō)明

    vue中的文本空格占位符說(shuō)明

    這篇文章主要介紹了vue中的文本空格占位符說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Vue常用的修飾符及應(yīng)用場(chǎng)景解讀

    Vue常用的修飾符及應(yīng)用場(chǎng)景解讀

    這篇文章主要介紹了Vue常用的修飾符及應(yīng)用場(chǎng)景解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • webstorm添加*.vue文件支持

    webstorm添加*.vue文件支持

    這篇文章主要介紹了webstorm添加*.vue文件支持,webstorm很多的插件內(nèi)置,不用安裝插件,下面嘗試用vue和es6做項(xiàng)目,有興趣的可以了解一下
    2018-05-05
  • vue中用qrcode庫(kù)將超鏈接生成二維碼圖片的示例代碼

    vue中用qrcode庫(kù)將超鏈接生成二維碼圖片的示例代碼

    生成二維碼是一種常見(jiàn)的需求,無(wú)論是用于商業(yè)宣傳還是個(gè)人分享,二維碼都可以提供快速方便的方式來(lái)傳遞信息,在Vue框架中,我們可以使用qrcode庫(kù)來(lái)輕松地生成二維碼,本篇博文將介紹如何安裝qrcode庫(kù),并通過(guò)一個(gè)實(shí)際例子來(lái)展示如何生成二維碼,需要的朋友可以參考下
    2023-12-12
  • Vue項(xiàng)目中配置pug解析支持

    Vue項(xiàng)目中配置pug解析支持

    這篇文章主要介紹了Vue項(xiàng)目中配置pug解析支持的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05

最新評(píng)論