今天有个朋友说要作个效果: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