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

Vue利用draggable實現(xiàn)多選拖拽效果

 更新時間:2022年05月06日 14:48:04   作者:宜簡  
這篇文章主要為大家詳細介紹了如何利用vue中的draggable插件實現(xiàn)多選拖拽效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前言

最近產(chǎn)品提出一個排序需求,希望能進行拖拽排序,我一想,vue2插件這么多,sortable.js、draggable分分鐘實現(xiàn)了,但是還有一個需求希望能夠?qū)崿F(xiàn)多選拖拽,這個就有點麻煩,查詢了許多資料,暫時沒有發(fā)現(xiàn)能夠多選的拖拽組件,如果自己寫一個,既耗費時間,實現(xiàn)效果上必然沒有draggable這種成熟輪子效果好,于是決定基于draggable做改進。

實現(xiàn)思路

我們知道draggable插件只要設(shè)置相同的group名字就能實現(xiàn)分組拖拽,如果我們渲染兩個同名分組,控制第二個分組的顯示與隱藏,魚目混珠,就能實現(xiàn)簡單的多選拖拽效果

1.通過group="task"設(shè)置兩個同名分組,同時利用draggable=".card"屬性,控制class名稱,禁止單選

  <draggable group="task" v-model="dataList" @end="draggerEnd" class=""
        :class="show ? 'order-box-show' : 'order-box'" animation="300" draggable=".card">
        <transition-group>
          <div v-for="(item, index) in dataList" :key="index" class="box" @click="handleSelect(index)"
            :class="item.select || show ? 'card' : ''">{{ item.name }}
          </div>
        </transition-group>
      </draggable>
      <div class="position" v-show="show">
        <draggable group="task" v-model="dataList2" @end="draggerEnd" class="order-box" animation="300">
          <transition-group>
            <div v-for="(item, index) in dataList2" :key="index" class="boxs">
              <div>
                {{ item.name }}
              </div>
            </div>
          </transition-group>
        </draggable>

2.通過v-show="show"控制第二個分組的隱藏與展示,同時對數(shù)據(jù)做處理,并且在拖拽結(jié)束后,要在分組一中找到分組二拖拽過來的初始元素刪掉

    const findIndex = this.dataList.findIndex((item => item.name === '選中元素展示區(qū)'))
      this.dataList.splice(findIndex, 1)

Demo全部代碼

<template>
  <div>
    <div>
      <draggable group="task" v-model="dataList" @end="draggerEnd" class=""
        :class="show ? 'order-box-show' : 'order-box'" animation="300" draggable=".card">
        <transition-group>
          <div v-for="(item, index) in dataList" :key="index" class="box" @click="handleSelect(index)"
            :class="item.select || show ? 'card' : ''">{{ item.name }}
          </div>
        </transition-group>
      </draggable>
      <div class="position" v-show="show">
        <draggable group="task" v-model="dataList2" @end="draggerEnd" class="order-box" animation="300">
          <transition-group>
            <div v-for="(item, index) in dataList2" :key="index" class="boxs">
              <div>
                {{ item.name }}
              </div>
            </div>
          </transition-group>
        </draggable>
      </div>
    </div>
    <el-button style="marginLeft:50px" @click="handleStart">確認</el-button>
  </div>
</template>

<script>
import draggable from 'vuedraggable'
export default {
  components: {
    draggable
  },
  data() {
    return {
      dataList: [
      ],
      dataList2: [{ name: '選中元素展示區(qū)' }],
      show: false,
      selectArr: [],
    }
  },
  mounted() {
    for (var i = 0; i < 60; i++) {
      this.dataList.push({ name: i, select: false })
    }
  },
  methods: {
    handleSelect(index) {
      const data = JSON.parse(JSON.stringify(this.dataList))
      data[index].select = true
      this.selectArr.push({ ...data[index] })
      this.dataList = JSON.parse(JSON.stringify(data))
    },
    handleStart(e) {
      if (!this.selectArr.length) {
        return
      }
      this.show = true
      this.selectArr.forEach((item, index) => {
        const Index = this.dataList.findIndex(it => item.name === it.name)
        this.dataList.splice(Index, 1)
      })
    },
    draggerEnd(e) {
      const newIndex = e.newIndex
      this.dataList.splice(newIndex, 0, ...this.selectArr)
      const findIndex = this.dataList.findIndex((item => item.name === '選中元素展示區(qū)'))
      this.dataList.splice(findIndex, 1)
      this.show = false
    },


  }
}
</script>

<style lang="scss" scoped>
.order-box {
  padding: 20px 50px;
  display: flex;
  flex-wrap: wrap;

  >span {
    flex: 1;
    display: flex;
    flex-wrap: wrap;
  }

  .box {
    width: 100px;
    height: 50px;
    background: rgb(7, 174, 215);
    margin-right: 10px;
    margin-bottom: 10px;
  }

  .boxs {
    width: 100px;
    height: 50px;
    background: rgb(215, 177, 7);
    margin-right: 10px;
    margin-bottom: 10px;
  }

  .card {
    background: rgb(128, 68, 0) !important;
  }
}

.order-box-show {
  padding: 20px 50px;
  display: flex;
  flex-wrap: wrap;

  >span {
    flex: 1;
    display: flex;
    flex-wrap: wrap;
  }

  .box {
    width: 100px;
    height: 50px;
    background: rgb(7, 174, 215);
    margin-right: 10px;
    margin-bottom: 10px;
  }

  .boxs {
    width: 100px;
    height: 50px;
    background: rgb(215, 177, 7);
    margin-right: 10px;
    margin-bottom: 10px;
  }
}

.position {
  border: 1px solid red;
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  cursor: pointer;
}
</style>

Demo實現(xiàn)效果

到此這篇關(guān)于Vue利用draggable實現(xiàn)多選拖拽效果的文章就介紹到這了,更多相關(guān)Vue draggable多選拖拽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3 獲取元素高度不準的問題

    vue3 獲取元素高度不準的問題

    這篇文章主要介紹了vue3 獲取元素高度不準的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • VUE?mixin?使用示例詳解

    VUE?mixin?使用示例詳解

    混入mixin提供了一種非常靈活的方式,來分發(fā)Vue組件中的可復(fù)用功能,一個混入對象可以包含任意組件選項,接下來通過本文給大家介紹VUE?mixin?使用,需要的朋友可以參考下
    2022-08-08
  • vue左右側(cè)聯(lián)動滾動的實現(xiàn)代碼

    vue左右側(cè)聯(lián)動滾動的實現(xiàn)代碼

    這篇文章主要介紹了vue左右側(cè)聯(lián)動滾動的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Vue框架之goods組件開發(fā)詳解

    Vue框架之goods組件開發(fā)詳解

    這篇文章主要介紹了Vue框架之goodvs組件開發(fā)詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Vue實現(xiàn)購物車實例代碼兩則

    Vue實現(xiàn)購物車實例代碼兩則

    這篇文章主要介紹了Vue實現(xiàn)購物車實例代碼,需要的朋友可以參考下
    2020-05-05
  • Vue.js中該如何自己維護路由跳轉(zhuǎn)記錄

    Vue.js中該如何自己維護路由跳轉(zhuǎn)記錄

    這篇文章主要給大家介紹了關(guān)于Vue.js中該如何自己維護路由跳轉(zhuǎn)記錄的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Vue.js具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Vue實現(xiàn)6位數(shù)密碼效果

    Vue實現(xiàn)6位數(shù)密碼效果

    這篇文章主要為大家詳細介紹了Vue實現(xiàn)6位數(shù)密碼,優(yōu)化iOS WebView卡頓,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • vue-cli整合vuex的時候,修改actions和mutations,實現(xiàn)熱部署的方法

    vue-cli整合vuex的時候,修改actions和mutations,實現(xiàn)熱部署的方法

    今天小編就為大家分享一篇vue-cli整合vuex的時候,修改actions和mutations,實現(xiàn)熱部署的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Vite結(jié)合Vue刪除指定環(huán)境的console.log問題

    Vite結(jié)合Vue刪除指定環(huán)境的console.log問題

    這篇文章主要介紹了Vite結(jié)合Vue刪除指定環(huán)境的console.log問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Vue?eventBus事件總線封裝后再用的方式

    Vue?eventBus事件總線封裝后再用的方式

    EventBus稱為事件總線,當(dāng)兩個組件屬于不同的兩個組件分支,或者兩個組件沒有任何聯(lián)系的時候,不想使用Vuex這樣的庫來進行數(shù)據(jù)通信,就可以通過事件總線來進行通信,這篇文章主要給大家介紹了關(guān)于Vue?eventBus事件總線封裝后再用的相關(guān)資料,需要的朋友可以參考下
    2022-06-06

最新評論

建水县| 临澧县| 武穴市| 涟水县| 沁源县| 阿合奇县| 大厂| 象山县| 兴安县| 沙雅县| 邵阳市| 海伦市| 宿松县| 盐池县| 大石桥市| 扎赉特旗| 紫阳县| 阜阳市| 淮阳县| 巨鹿县| 江都市| 济南市| 汉源县| 文水县| 赤壁市| 喀什市| 绥滨县| 平顶山市| 嘉禾县| 民丰县| 合江县| 克东县| 神池县| 杂多县| 论坛| 根河市| 莱州市| 贡嘎县| 普定县| 井研县| 绥棱县|