今天有個朋友說要作個效果:Vue實現拖拽排序,要有 checked,輸出結果是排序後的,要全選,未選中的不能拖動。html
其實我以前基於 Sortable
作過一個相似的效果。也給他看過了,沒看太明白,他就本身基於 vuedraggable 實現了一下。前端
正好有點問題給他解決了一下。廢話很少說,先上最終效果:Vue 拖拽排序效果 測試地址。下面就是最終效果圖。vue
就下面這樣,elementUI 官方 Demo。很簡單毫無挑戰呀。git
<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>
拖拽效果基於 vuedraggable 實現。github
這裏我憑藉個人資深經(踩)驗(坑),先提出幾個可能存在的問題。微信
<el-checkbox-group v-model="checkedCities">
實現的效果只是記錄選中的項,無排序 vue 和 jQuery 作起來最大的區別是什麼?基於以下描述,會出現視圖顯示和數據對不上。函數
<el-checkbox-group v-model="checkedCities">
的問題比較好解決。咱們在數據的時候根據數據源排序一把就 ok。Vue.Draggable
的封裝仍是有點東西的,他提供了 :list="cities"
讓你傳入數據源,而後操做的時候替你修改數據。<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>
上面咱們已經實現了拖拽。可是未選中也能拖拽排序就感受怪怪的。
這裏有兩個作法測試
draggable=".item"
,指定可拖拽元素的 class。DOM
該不應執行拖拽。歡迎你們關注個人公衆號。有疑問也能夠加個人微信前端交流羣。
spa