共计 1770 个字符,预计需要花费 5 分钟才能阅读完成。
需求很简单,拖动框框或者数字来调整顺序。如下图
一、找轮子
在网上搜了一会发现一个好用的插件——vue-draggable
二、使用方法
1. 安装npm i -S vuedraggable
2. 引用import draggable from 'vuedraggable'
3. 实现需求
<template>
<div class="dragbox">
<div class="note"> 拖动题型或题号调整顺序 </div>
<draggable v-model="list" v-bind="firstDragOptions" @change="changeTitle">
<transition-group>
<div class="titleBox" v-for="(item,index) in list" :key="index">
<div class="firstTitle">{{item.firstTitle}}</div>
<draggable v-model="item.secondTitle" @change="changeNum" v-bind="secondDragOptions" :group="'changeNum'+index">
<transition-group>
<div class="secondTitle" v-for="(title,key) in item.secondTitle" :key="key">
<span class="num">{{title}}</span>
</div>
</transition-group>
</draggable>
</div>
</transition-group>
</draggable>
</div>
</template>
<script>
import draggable from "vuedraggable";
import cloneDeep from "lodash/cloneDeep";
export default {
name: "DragComponent",
components: {draggable},
props: ["dragTitles"],
data() {
return {list: []
};
},
computed: {firstDragOptions() {
return {
group: "changeTitle",
animation: 200,
disabled: false,
ghostClass: "ghost"
};
},
secondDragOptions() {
return {
animation: 200,
disabled: false,
ghostClass: "ghost2"
};
}
},
created() {this.list = cloneDeep(this.dragTitles);
},
methods: {changeTitle(evt) {console.log("this.list:", this.list);
},
changeNum(evt) {console.log("this.list:", this.list);
}
}
};
</script>
<style lang="scss" scoped>
.dragbox {padding: 0 10px;}
.note {
color: #999999;
font-size: 14px;
}
.titleBox {
height: 116px;
padding: 10px 20px;
border: 1px dashed #999;
margin-top: 20px;
}
.firstTitle {
font-size: 16px;
color: #000;
}
.secondTitle {
width: 40px;
height: 40px;
border: 1px solid rgb(0, 153, 255);
border-radius: 6px;
line-height: 40px;
text-align: center;
margin-top: 20px;
font-size: 14px;
display: inline-block;
margin-right: 10px;
}
</style>
4. 注意事项
- group 属性相同的话可以互相拖拽,故不想互相拖拽的话,要分开设置。比如我用
:group="'changeNum'+index"
使每个框的数字互不干扰。 - 父组件传过来的数据不能直接双向绑定,可以克隆一下数据再绑定。
正文完
发表至: javascript
2019-11-12