自定义封装一个列表类似el-table实现多选功能
时间: 2023-07-18 19:51:16 浏览: 192
el-table无限滚动+控制列是否显示+列排序(非json)
5星 · 资源好评率100%
好的,我可以帮您解答这个问题。首先,我们需要定义一个列表组件,并在组件内部实现多选功能。下面是一个简单的实现示例:
```vue
<template>
<div>
<table>
<thead>
<tr>
<th><input type="checkbox" v-model="allSelected"></th>
<th v-for="column in columns">{{ column.label }}</th>
</tr>
</thead>
<tbody>
<tr v-for="item in items" :key="item.id">
<td><input type="checkbox" v-model="selectedItems" :value="item"></td>
<td v-for="column in columns">{{ item[column.key] }}</td>
</tr>
</tbody>
</table>
</div>
</template>
<script>
export default {
props: {
columns: Array, // 表格列定义
items: Array // 表格数据
},
data() {
return {
allSelected: false, // 是否全选
selectedItems: [] // 已选中的数据项
};
},
watch: {
// 监听全选状态变化
allSelected(val) {
if (val) {
this.selectedItems = this.items.slice(); // 全选
} else {
this.selectedItems = []; // 取消全选
}
},
// 监听已选中的数据项变化
selectedItems(val) {
this.$emit("select", val); // 触发自定义事件
}
}
};
</script>
```
在上面的代码中,我们定义了一个列表组件,并在该组件内部实现了多选功能。我们使用了一个表格来展示列表数据,并在表格中添加了一个全选/取消全选的复选框和每行数据项的复选框。当用户点击全选复选框时,我们使用 `v-model` 指令将其绑定到 `allSelected` 变量上,并在其状态变化时更新已选中的数据项。当用户勾选某个数据项的复选框时,我们将其添加到 `selectedItems` 数组中,并触发一个自定义事件,以便外部组件可以监听到已选中的数据项。
你可以在外部组件中使用该自定义列表组件,并通过监听其 `select` 事件来获取已选中的数据项,例如:
```vue
<template>
<div>
<my-table :columns="columns" :items="items" @select="handleSelect"></my-table>
</div>
</template>
<script>
import MyTable from "./MyTable";
export default {
components: {
MyTable
},
data() {
return {
columns: [
{ key: "id", label: "ID" },
{ key: "name", label: "Name" },
{ key: "age", label: "Age" }
],
items: [
{ id: 1, name: "Alice", age: 18 },
{ id: 2, name: "Bob", age: 20 },
{ id: 3, name: "Charlie", age: 22 }
],
selectedItems: [] // 已选中的数据项
};
},
methods: {
// 监听自定义列表组件的 select 事件
handleSelect(val) {
this.selectedItems = val;
}
}
};
</script>
```
在上面的代码中,我们使用了 `my-table` 组件来展示一个简单的列表,并在外部组件中监听了其 `select` 事件,并将已选中的数据项存储在 `selectedItems` 变量中。这样,我们就实现了一个简单的自定义列表组件,并在其中实现了多选功能。
阅读全文