下面我将详细讲解在Vue中如何使用elementui与Sortable.js实现列表拖动排序。
1. 安装ElementUI与Sortable.js
首先,我们需要安装ElementUI和Sortable.js。在终端中使用以下命令安装:
npm install element-ui sortablejs --save
2. 引入ElementUI与Sortable.js
在我们的Vue项目中,我们需要在需要使用的组件中引入ElementUI与Sortable.js:
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import Sortable from 'sortablejs';
3. 编写列表组件的HTML结构
编写一个简单的列表组件,其中包含一个可拖动的列表,并在列表中显示一些数据元素。
<template>
<div>
<el-card>
<div class="block">
<el-button type="primary" @click="add()">添加</el-button>
</div>
<ul class="list">
<li v-for="(item, index) in list" :key="index" class="item">
<span class="handle">{{ index + 1 }}</span>
<span class="content">{{ item }}</span>
<el-button type="danger" size="small" @click="deleteItem(index)">删除</el-button>
</li>
</ul>
</el-card>
</div>
</template>
4. 添加拖拽功能
在组件的mounted钩子中,我们通过getElementById方法获取到列表中的UL元素,并使用Sortable.js初始化拖拽功能。
mounted() {
let that = this
let listEl = document.getElementById('list')
Sortable.create(listEl, {
animation: 150,
onSort: function (evt) {
that.updateList()
}
})
},
这里要注意,在使用Sortable.js的过程中,我们通过调用updateList方法实时更新列表数据。
methods: {
updateList() {
this.list = [].slice.call(document.querySelectorAll('.list .item .content')).map(function (item) {
return item.innerText
})
}
}
5. 添加元素
我们在列表的头部添加了一个“添加”按钮,当用户点击按钮时,会弹出一个对话框,让用户输入要添加的新元素。
add() {
let that = this
this.$prompt('请输入要添加的内容', '', {
confirmButtonText: '确定',
cancelButtonText: '取消'
}).then(({ value }) => {
if (!value) return
that.list.push(value)
that.updateList()
this.$message({
type: 'success',
message: '添加成功!'
})
})
},
6. 删除元素
在列表元素的右侧,我们添加了一个“删除”按钮,当用户点击该按钮时,会删除该元素。
deleteItem(index) {
let that = this
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
that.list.splice(index, 1)
that.updateList()
this.$message({
type: 'success',
message: '删除成功!'
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
},
7. 示例说明
示例一
我们有一个包含多个元素的列表,我们希望用户可以将列表元素拖动排序。当用户点击“添加”按钮时,会弹出一个对话框,让用户输入要添加的新元素。当用户点击某个元素右侧的“删除”按钮时,会删除该元素。我们可以通过以下代码实现:
<template>
<div>
<el-card>
<div class="block">
<el-button type="primary" @click="add()">添加</el-button>
</div>
<ul id="list" class="list">
<li v-for="(item, index) in list" :key="index" class="item">
<span class="handle">{{ index + 1 }}</span>
<span class="content">{{ item }}</span>
<el-button type="danger" size="small" @click="deleteItem(index)">删除</el-button>
</li>
</ul>
</el-card>
</div>
</template>
<script>
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import Sortable from 'sortablejs';
export default {
name: 'SortableList',
components: {
ElementUI
},
data() {
return {
list: ['列表元素1', '列表元素2', '列表元素3']
}
},
mounted() {
let that = this
let listEl = document.getElementById('list')
Sortable.create(listEl, {
animation: 150,
onSort: function (evt) {
that.updateList()
}
})
},
methods: {
updateList() {
this.list = [].slice.call(document.querySelectorAll('.list .item .content')).map(function (item) {
return item.innerText
})
},
add() {
let that = this
this.$prompt('请输入要添加的内容', '', {
confirmButtonText: '确定',
cancelButtonText: '取消'
}).then(({ value }) => {
if (!value) return
that.list.push(value)
that.updateList()
this.$message({
type: 'success',
message: '添加成功!'
})
})
},
deleteItem(index) {
let that = this
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
that.list.splice(index, 1)
that.updateList()
this.$message({
type: 'success',
message: '删除成功!'
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
}
}
}
</script>
<style>
.list {
padding: 0;
margin: 0;
list-style: none;
}
.item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px;
border-bottom: 1px solid #f1f1f1;
}
.handle {
cursor: move;
margin-right: 10px;
}
.content {
flex: 1;
margin-right: 10px;
}
.block {
text-align: right;
margin-bottom: 10px;
}
</style>
这个示例中,我们使用Sortable.js的onSort回调函数将列表数据同步更新到Vue组件中。在添加新元素或删除元素时,我们同样需要更新列表数据。
示例二
我们有一个包含多个任务的列表,我们希望用户可以通过拖动列表元素的方式进行排序。当用户点击“添加”按钮时,会弹出一个对话框,让用户输入新任务的标题和描述。当用户点击某个元素右侧的“删除”按钮时,会删除该任务。我们可以通过以下代码实现:
<template>
<div>
<el-card>
<div class="block">
<el-button type="primary" @click="add()">添加任务</el-button>
</div>
<ul id="list" class="list">
<li v-for="(item, index) in list" :key="item.id" class="item">
<span class="content">{{ item.title }} {{ item.desc }}</span>
<el-button type="danger" size="small" @click="deleteItem(item)">删除</el-button>
</li>
</ul>
</el-card>
</div>
</template>
<script>
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import Sortable from 'sortablejs';
export default {
name: 'SortableList',
components: {
ElementUI
},
data() {
return {
id: 0,
list: [
{ id: 1, title: '任务1', desc: '任务1描述' },
{ id: 2, title: '任务2', desc: '任务2描述' },
{ id: 3, title: '任务3', desc: '任务3描述' }
]
}
},
mounted() {
let that = this
let listEl = document.getElementById('list')
Sortable.create(listEl, {
animation: 150,
onSort: function (evt) {
that.updateList()
}
})
},
methods: {
updateList() {
this.list = [].slice.call(document.querySelectorAll('.list .item')).map(function (item) {
return {
id: Number(item.getAttribute('data-id')),
title: item.querySelector('.content').innerText.trim(),
desc: item.querySelector('.desc').innerText.trim()
}
})
},
add() {
let that = this
this.$prompt('请输入要添加的任务标题', '添加任务', {
confirmButtonText: '下一步',
cancelButtonText: '取消'
}).then(({ value: title }) => {
if (!title) return
this.$prompt('请输入要添加的任务描述', '添加任务', {
confirmButtonText: '确定',
cancelButtonText: '取消'
}).then(({ value: desc }) => {
if (!desc) return
that.list.push({
id: ++that.id,
title: title,
desc: desc
})
that.updateList()
this.$message({
type: 'success',
message: '添加成功!'
})
})
})
},
deleteItem(item) {
let that = this
this.$confirm(`确定要删除“${item.title}”吗?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
that.list = that.list.filter((i) => i.id !== item.id)
that.updateList()
this.$message({
type: 'success',
message: '删除成功!'
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
}
}
}
</script>
<style>
.list {
padding: 0;
margin: 0;
list-style: none;
}
.item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px;
border-bottom: 1px solid #f1f1f1;
}
.handle {
cursor: move;
margin-right: 10px;
}
.content {
flex: 1;
margin-right: 10px;
}
.desc {
opacity: 0.7;
}
.block {
text-align: right;
margin-bottom: 10px;
}
</style>
这个示例中,我们在列表元素中添加了任务的标题和描述,并在添加新任务时需要依次输入两个内容。我们通过data-id属性将任务的ID绑定到列表元素上,以便在删除任务时快速查找元素。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue中使用elementui与Sortable.js实现列表拖动排序 - Python技术站