Vue?基于?vuedraggable?實現(xiàn)選中、拖拽、排序效果
今天有個朋友說要做個效果:Vue實現(xiàn)拖拽排序,要有 checked,輸出結(jié)果是排序后的,要全選,未選中的不能拖動。
其實我之前基于 Sortable 做過一個類似的效果。也給他看過了,沒看太明白,他就自己基于 vuedraggable 實現(xiàn)了一下。
正好有點(diǎ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ù)。
基于上面兩點(diǎn),就可以看到基本上操作 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 的封裝還是有點(diǎn)東西的,他提供了 :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ù)上去自己判斷當(dāng)前
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>相關(guān)文檔
官方地址:https://sortablejs.github.io/Vue.Draggable/#/simple
Github:https://github.com/SortableJS/Vue.Draggable
Demo:https://david-desmaisons.github.io/draggable-example/
到此這篇關(guān)于Vue 基于 vuedraggable 實現(xiàn)選中、拖拽、排序效果的文章就介紹到這了,更多相關(guān)vue vuedraggable實現(xiàn)選中、拖拽、排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
intellij?idea+vue前端調(diào)試配置圖文教程
在Vue項目開發(fā)過程中,當(dāng)遇到應(yīng)用邏輯出現(xiàn)錯誤,但又無法準(zhǔn)確定位的時候,知曉Vue項目調(diào)試技巧至關(guān)重要,debug是必備技能,這篇文章主要給大家介紹了關(guān)于intellij?idea+vue前端調(diào)試配置的相關(guān)資料,需要的朋友可以參考下2024-09-09
使用vue3+vite導(dǎo)入圖片路徑錯亂問題排查及解決
使用vue3+vite開發(fā)的時候,導(dǎo)入svg圖片時,同一個文件夾下的文件,其中一個路徑正常解析,另一個不行,更改文件名之后,該圖片文件就可以正常解析了,本文給大家介紹了使用vue3+vite導(dǎo)入圖片路徑錯亂問題排查及解決,需要的朋友可以參考下2024-03-03
vue中如何使用echarts和echarts-gl實現(xiàn)3D餅圖環(huán)形餅圖
現(xiàn)在vue是很多公司前端的主流框架,我目前所在公司接觸的項目也都是使用vue來實現(xiàn)的,很少有完全使用原生的JavaScript來寫項目的了,下面這篇文章主要給大家介紹了關(guān)于vue中如何使用echarts和echarts-gl實現(xiàn)3D餅圖環(huán)形餅圖的相關(guān)資料,需要的朋友可以參考下2023-03-03

