Vue?基于?vuedraggable?實現(xiàn)選中、拖拽、排序效果
今天有個朋友說要做個效果:Vue實現(xiàn)拖拽排序,要有 checked,輸出結(jié)果是排序后的,要全選,未選中的不能拖動。
其實我之前基于 Sortable
做過一個類似的效果。也給他看過了,沒看太明白,他就自己基于 vuedraggable 實現(xiàn)了一下。
正好有點問題給他解決了一下。廢話不多說,先上最終效果:Vue 拖拽排序效果 測試地址。下面就是最終效果圖。
效果一:實現(xiàn)選中 和 全選效果
就下面這樣,elementUI 官方 Demo。很簡單毫無挑戰(zhàn)呀。
<el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange" >全部</el-checkbox > <el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange" > <el-checkbox :class="{'item': checkedCities.find(v=>v==city)}" v-for="city in cities" :label="city" :key="city">{{ city }}</el-checkbox> </el-checkbox-group>
效果二:實現(xiàn)拖拽效果
拖拽效果基于 vuedraggable 實現(xiàn)。
問題
這里我憑借我的資深經(jīng)(踩)驗(坑),先提出幾個可能存在的問題。
<el-checkbox-group v-model="checkedCities">
實現(xiàn)的效果只是記錄選中的項,無排序- vue 和 jQuery 做起來最大的區(qū)別是什么?基于如下描述,會出現(xiàn)視圖顯示和數(shù)據(jù)對不上。
vue 通過數(shù)據(jù)驅(qū)動視圖,也可以理解為數(shù)據(jù)改變,視圖自動改變。
jQuery 通過改變直接視圖先反饋數(shù)據(jù)。
基于上面兩點,就可以看到基本上操作 DOM 的庫,Vue 在使用的時候都有問題。
因為他們只操作了 DOM,而 Vue 需要是的你修改數(shù)據(jù)。
解決方案 & 代碼
<el-checkbox-group v-model="checkedCities">
的問題比較好解決。我們在數(shù)據(jù)的時候根據(jù)數(shù)據(jù)源排序一把就 ok。
因為問題是庫只修改 DOM,未修改數(shù)據(jù),那么我們可以考慮監(jiān)聽他的回調(diào)事件,然后手動的去修改數(shù)據(jù)(Sortable 我就這樣做的)。Vue.Draggable
的封裝還是有點東西的,他提供了 :list="cities"
讓你傳入數(shù)據(jù)源,然后操作的時候替你修改數(shù)據(jù)。
<el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange" >全部</el-checkbox> <el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange"> <draggable draggable=".item" :list="cities"> <el-checkbox :class="{'item': checkedCities.find(v=>v==city)}" v-for="city in cities" :label="city" :key="city">{{ city }}</el-checkbox> </draggable> </el-checkbox-group>
效果三:只有選中的才能拖拽
上面我們已經(jīng)實現(xiàn)了拖拽。但是未選中也能拖拽排序就感覺怪怪的。
這里有兩個做法
- 我是記得有提供這樣的功能,找了找文檔果然有
draggable=".item"
,指定可拖拽元素的 class。 - 但是它這個效果很詭異,未選中的的確不能拖動了,但是你也不能拖動已選中的占據(jù)他的位置。
- 所以我又加了個處理。我對數(shù)據(jù)源做了排序,這樣選中和未選中就分堆了。
- 接下來說第二種方案。那就是在他提供的鉤子函數(shù)上去自己判斷當前
DOM
該不該執(zhí)行拖拽。
Vue 的庫在使用中要注意操作元數(shù)據(jù),而不是只修改 DOM。
ps:下面在看下vue + vuedraggable 實現(xiàn)拖拽排序
安裝
npm install vuedraggable
引入
import draggable from 'vuedraggable'
注冊
components: { draggable }
html
<draggable class="list" v-model="modules" :clone="clone" :options="{ group: { name: 'layout', pull: 'clone', put: false }, draggable: '.item', forceFallback: true, sort: false, animation: 50 }"> <transition-group tag="ul"> <li v-for="(item, index) in modules" :key="index" class="item"> <div class="holder"> <img :src="item.icon" /> <h3>{{item.text}}</h3> </div> </li> </transition-group> </draggable>
相關文檔
官方地址:https://sortablejs.github.io/Vue.Draggable/#/simple
Github:https://github.com/SortableJS/Vue.Draggable
Demo:https://david-desmaisons.github.io/draggable-example/
到此這篇關于Vue 基于 vuedraggable 實現(xiàn)選中、拖拽、排序效果的文章就介紹到這了,更多相關vue vuedraggable實現(xiàn)選中、拖拽、排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
intellij?idea+vue前端調(diào)試配置圖文教程
在Vue項目開發(fā)過程中,當遇到應用邏輯出現(xiàn)錯誤,但又無法準確定位的時候,知曉Vue項目調(diào)試技巧至關重要,debug是必備技能,這篇文章主要給大家介紹了關于intellij?idea+vue前端調(diào)試配置的相關資料,需要的朋友可以參考下2024-09-09vue中如何使用echarts和echarts-gl實現(xiàn)3D餅圖環(huán)形餅圖
現(xiàn)在vue是很多公司前端的主流框架,我目前所在公司接觸的項目也都是使用vue來實現(xiàn)的,很少有完全使用原生的JavaScript來寫項目的了,下面這篇文章主要給大家介紹了關于vue中如何使用echarts和echarts-gl實現(xiàn)3D餅圖環(huán)形餅圖的相關資料,需要的朋友可以參考下2023-03-03