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

vue實(shí)現(xiàn)列表拖拽排序的功能

 更新時(shí)間:2020年11月02日 14:18:09   作者:陳山豆  
這篇文章主要介紹了vue實(shí)現(xiàn)列表拖拽排序的功能,幫助大家更好的理解和學(xué)習(xí)vue,感興趣的朋友可以了解下

  在日常開發(fā)中,特別是管理端,經(jīng)常會(huì)遇到要實(shí)現(xiàn)拖拽排序的效果;這里提供一種簡單的實(shí)現(xiàn)方案。

  此例子基于vuecli3

首先,我們先了解一下js原生拖動(dòng)事件:

  在拖動(dòng)目標(biāo)上觸發(fā)事件 (源元素):

  • ondragstart - 用戶開始拖動(dòng)元素時(shí)觸發(fā)
  • ondrag - 元素正在拖動(dòng)時(shí)觸發(fā)
  • ondragend - 用戶完成元素拖動(dòng)后觸發(fā)  

  釋放目標(biāo)時(shí)觸發(fā)的事件:

  • ondragenter - 當(dāng)被鼠標(biāo)拖動(dòng)的對(duì)象進(jìn)入其容器范圍內(nèi)時(shí)觸發(fā)此事件
  • ondragover - 當(dāng)某被拖動(dòng)的對(duì)象在另一對(duì)象容器范圍內(nèi)拖動(dòng)時(shí)觸發(fā)此事件
  • ondragleave - 當(dāng)被鼠標(biāo)拖動(dòng)的對(duì)象離開其容器范圍內(nèi)時(shí)觸發(fā)此事件
  • ondrop - 在一個(gè)拖動(dòng)過程中,釋放鼠標(biāo)鍵時(shí)觸發(fā)此事件

 基于js的原生拖拽事件,本次實(shí)現(xiàn)的拖拽排序的原理大概是:鼠標(biāo)按住列表某一項(xiàng)開始拖動(dòng)時(shí)觸發(fā)ondragstart事件,將該拖動(dòng)項(xiàng)用變量記錄下來;

接著拖拽過程中,該拖動(dòng)項(xiàng)經(jīng)過列表其他項(xiàng)時(shí),觸發(fā)ondragenter事件,同樣記錄該拖動(dòng)項(xiàng)最后經(jīng)過的列表其他項(xiàng)的數(shù)據(jù),最后在ondragend 事件中

將數(shù)組列表刪掉一開始o(jì)ndragstart事件記錄的拖動(dòng)項(xiàng),并將刪掉的數(shù)據(jù)插入ondragenter事件最后記錄的位置,完成拖動(dòng)排序。

 具體代碼如下:

<template>
  <div class="test_wrapper" @dragover="dragover($event)">
    <transition-group class="transition-wrapper" name="sort">
      <div v-for="(item) in dataList" :key='item.id' class="sort-item"
        :draggable="true"
        @dragstart="dragstart(item)"
        @dragenter="dragenter(item,$event)"
        @dragend="dragend(item,$event)"
        @dragover="dragover($event)"
      >
        {{ item.label }}
      </div>
    </transition-group>
  </div>
</template>

<script lang="ts">
  import {Vue, Component, Prop, Watch} from "vue-property-decorator";
  import { addWebsite } from '@/api'
  @Component({
    components: {}
  })
  export default class Test extends Vue {

    oldData: any = null; // 開始排序時(shí)按住的舊數(shù)據(jù)
    newData: any = null; // 拖拽過程的數(shù)據(jù)

    // 列表數(shù)據(jù)
    dataList:any = [
      { id:1,label:'測試一號(hào)' },
      { id:2,label:'測試二號(hào)' },
      { id:3,label:'測試三號(hào)' },
      { id:4,label:'測試四號(hào)' },
    ];

    dragstart(value: any) {
      this.oldData = value
    }

    // 記錄移動(dòng)過程中信息
    dragenter(value: any, e: any) {
      this.newData = value
      e.preventDefault()
    }

    // 拖拽最終操作
    dragend(value: any, e: any) {
      if (this.oldData !== this.newData) {
        let oldIndex = this.dataList.indexOf(this.oldData)
        let newIndex = this.dataList.indexOf(this.newData)
        let newItems = [...this.dataList]
        // 刪除老的節(jié)點(diǎn)
        newItems.splice(oldIndex, 1)
        // 在列表中目標(biāo)位置增加新的節(jié)點(diǎn)
        newItems.splice(newIndex, 0, this.oldData)
        this.dataList = [...newItems]
      }
    }


    // 拖動(dòng)事件(主要是為了拖動(dòng)時(shí)鼠標(biāo)光標(biāo)不變?yōu)榻梗?
    dragover(e: any) {
      e.preventDefault()
    }


  };
</script>

另外

  為了實(shí)現(xiàn)拖動(dòng)的動(dòng)畫效果,這里用到了transition-group組件,如上面代碼顯示,將transition-group組件的屬性name設(shè)為‘sort';并添加以下代碼;

    .sort-move {
      transition: transform 0.3s;
    }

       注意:為了讓transition有效果出現(xiàn),v-for渲染的數(shù)據(jù)列表必須有key屬性,且該key屬性不可設(shè)為index; 

最終效果如下:

以上就是vue實(shí)現(xiàn)列表拖拽排序的功能的詳細(xì)內(nèi)容,更多關(guān)于vue 拖拽排序的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue-element-admin登錄全流程分享

    vue-element-admin登錄全流程分享

    這篇文章主要介紹了vue-element-admin登錄全流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 實(shí)例詳解vue中的$root和$parent

    實(shí)例詳解vue中的$root和$parent

    這篇文章主要介紹了vue中的$root和$parent ,本文通過文字實(shí)例代碼相結(jié)合的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • 詳談vue中的rules表單驗(yàn)證(常用)

    詳談vue中的rules表單驗(yàn)證(常用)

    這篇文章主要介紹了關(guān)于vue中的rules表單驗(yàn)證(常用),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 使用echarts點(diǎn)擊按鈕從新渲染圖表并更新數(shù)據(jù)

    使用echarts點(diǎn)擊按鈕從新渲染圖表并更新數(shù)據(jù)

    這篇文章主要介紹了使用echarts點(diǎn)擊按鈕從新渲染圖表并更新數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 淺談Vue3中watchEffect的具體用法

    淺談Vue3中watchEffect的具體用法

    watchEffect,它立即執(zhí)行傳入的一個(gè)函數(shù),同時(shí)響應(yīng)式追蹤其依賴,并在其依賴變更時(shí)重新運(yùn)行該函數(shù),本文主要介紹了Vue3中watchEffect的具體用法,感興趣的可以了解一下
    2022-05-05
  • vue2.0 如何在hash模式下實(shí)現(xiàn)微信分享

    vue2.0 如何在hash模式下實(shí)現(xiàn)微信分享

    這篇文章主要介紹了vue2.0 如何在hash模式下實(shí)現(xiàn)微信分享,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • vue.js中toast用法及使用toast彈框的實(shí)例代碼

    vue.js中toast用法及使用toast彈框的實(shí)例代碼

    這篇文章主要介紹了vue.js中toast用法及使用toast彈框的實(shí)例代碼,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒加載,需要的朋友可以參考下
    2018-08-08
  • Vue.js綁定HTML class數(shù)組語法錯(cuò)誤的原因分析

    Vue.js綁定HTML class數(shù)組語法錯(cuò)誤的原因分析

    Vue.js綁定HTML class數(shù)組語法錯(cuò)誤有哪些原因?qū)е碌哪?,該如何解決呢?下面小編給大家分享Vue.js綁定HTML class數(shù)組語法錯(cuò)誤的原因分析,感興趣的朋友一起看看吧
    2016-10-10
  • 利用vue和element-ui設(shè)置表格內(nèi)容分頁的實(shí)例

    利用vue和element-ui設(shè)置表格內(nèi)容分頁的實(shí)例

    下面小編就為大家分享一篇利用vue和element-ui設(shè)置表格內(nèi)容分頁的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • 如何在 Vue 中使用 JSX

    如何在 Vue 中使用 JSX

    這篇文章主要介紹了如何在 Vue 中使用 JSX,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下
    2021-02-02

最新評(píng)論

连平县| 游戏| 邹平县| 北流市| 兴业县| 城步| 盐池县| 新龙县| 新巴尔虎右旗| 安徽省| 拉孜县| 友谊县| 小金县| 包头市| 佛山市| 西乌珠穆沁旗| 高安市| 开江县| 栖霞市| 筠连县| 河北省| 怀化市| 特克斯县| 山东省| 万源市| 常宁市| 武定县| 正定县| 延津县| 萨迦县| 中牟县| 东至县| 华容县| 濮阳县| 东乡| 平遥县| 浦东新区| 铁力市| 美姑县| 博罗县| 信阳市|