mirror of
https://github.com/continew-org/continew-admin-ui.git
synced 2025-09-09 20:57:17 +08:00
fix: 修复用户选择器数据重复选中的问题
This commit is contained in:
@@ -60,7 +60,7 @@
|
||||
<a-col :span="24" :md="6" class="section">
|
||||
<a-card>
|
||||
<template #title>已选择: {{ selectedKeys.length }}</template>
|
||||
<a-table :columns="selectedColumns" :data="selectedData" :pagination="paginationOptions">
|
||||
<a-table :columns="selectedColumns" :data="[...selectedData.values()]" :pagination="paginationOptions">
|
||||
<template #nickname="{ record }">
|
||||
{{ record.nickname }}({{ record.username }})
|
||||
</template>
|
||||
@@ -154,7 +154,7 @@ const reset = () => {
|
||||
// 选中用户 ID
|
||||
const selectedKeys = ref<string[]>([])
|
||||
// 选中用户信息
|
||||
const selectedData = ref<UserResp[]>([])
|
||||
const selectedData = ref<Map<string, UserResp>>(new Map())
|
||||
|
||||
const emitSelectUser = () => {
|
||||
emit('select-user', selectedKeys.value)
|
||||
@@ -163,24 +163,21 @@ const emitSelectUser = () => {
|
||||
// 单选
|
||||
const onSelect = (rowKeys: string[], rowKey: string, record: UserResp) => {
|
||||
if (props.multiple) {
|
||||
// 多选
|
||||
if (rowKeys.includes(rowKey)) {
|
||||
// 包含 选中
|
||||
selectedData.value.push(record)
|
||||
selectedKeys.value?.push(rowKey)
|
||||
// 选中时,添加到 Map
|
||||
selectedData.value.set(rowKey, record)
|
||||
selectedKeys.value = Array.from(selectedData.value.keys())
|
||||
} else {
|
||||
// 不包含 去除
|
||||
selectedData.value = selectedData.value.filter((item) => item.id !== rowKey)
|
||||
selectedKeys.value?.splice(selectedKeys.value?.indexOf(rowKey), 1)
|
||||
// 取消选中时,从 Map 移除
|
||||
selectedData.value.delete(rowKey)
|
||||
selectedKeys.value = Array.from(selectedData.value.keys())
|
||||
}
|
||||
} else {
|
||||
// 单选
|
||||
selectedData.value = []
|
||||
selectedData.value.clear()
|
||||
selectedKeys.value = []
|
||||
if (rowKeys.includes(rowKey)) {
|
||||
// 包含 选中
|
||||
selectedData.value.push(record)
|
||||
selectedKeys.value?.push(rowKey)
|
||||
selectedData.value.set(rowKey, record)
|
||||
selectedKeys.value = [rowKey]
|
||||
}
|
||||
}
|
||||
emitSelectUser()
|
||||
@@ -189,31 +186,31 @@ const onSelect = (rowKeys: string[], rowKey: string, record: UserResp) => {
|
||||
// 全选
|
||||
const onSelectAll = (checked: boolean) => {
|
||||
if (checked) {
|
||||
// 选中
|
||||
// 全选时,将所有数据添加到 Map
|
||||
dataList.value.forEach((item) => {
|
||||
selectedData.value.push(item)
|
||||
selectedKeys.value?.push(item.id)
|
||||
selectedData.value.set(item.id, item)
|
||||
})
|
||||
selectedKeys.value = Array.from(selectedData.value.keys())
|
||||
} else {
|
||||
// 取消选中
|
||||
// 取消全选时,清空 Map
|
||||
dataList.value.forEach((item) => {
|
||||
selectedData.value = selectedData.value.filter((i) => i.id !== item.id)
|
||||
selectedKeys.value?.splice(selectedKeys.value?.indexOf(item.id), 1)
|
||||
selectedData.value.delete(item.id)
|
||||
})
|
||||
selectedKeys.value = Array.from(selectedData.value.keys())
|
||||
}
|
||||
emitSelectUser()
|
||||
}
|
||||
|
||||
// 从选中列表中移除用户
|
||||
const handleDeleteSelectedUser = (user: UserResp) => {
|
||||
selectedData.value = selectedData.value.filter((i) => i.id !== user.id)
|
||||
selectedKeys.value?.splice(selectedKeys.value?.indexOf(user.id), 1)
|
||||
selectedData.value.delete(user.id)
|
||||
selectedKeys.value = Array.from(selectedData.value.keys())
|
||||
emitSelectUser()
|
||||
}
|
||||
|
||||
// 清空所有选中数据
|
||||
const onClearSelected = () => {
|
||||
selectedData.value = []
|
||||
selectedData.value.clear()
|
||||
selectedKeys.value = []
|
||||
emitSelectUser()
|
||||
}
|
||||
@@ -234,11 +231,19 @@ onMounted(async () => {
|
||||
if (props.value && props.value.length > 0) {
|
||||
const { data } = await listAllUser({ userIds: props.value })
|
||||
if (props.multiple) {
|
||||
selectedData.value = data.filter((item) => props.value.includes(item.id))
|
||||
selectedKeys.value = Array.from(selectedData.value).map((user) => user.id)
|
||||
// 使用 Map 存储用户,避免重复
|
||||
data.forEach((item) => {
|
||||
if (props.value.includes(item.id)) {
|
||||
selectedData.value.set(item.id, item)
|
||||
}
|
||||
})
|
||||
selectedKeys.value = Array.from(selectedData.value.keys())
|
||||
} else {
|
||||
selectedData.value = data.filter((item) => props.value[0] === item.id)
|
||||
selectedKeys.value = Array.from(selectedData.value).map((user) => user.id)
|
||||
const user = data.find((item) => props.value[0] === item.id)
|
||||
if (user) {
|
||||
selectedData.value.set(user.id, user)
|
||||
selectedKeys.value = [user.id]
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
@@ -201,7 +201,7 @@ onMounted(async () => {
|
||||
}
|
||||
// 获取所有用户
|
||||
const { data } = await listUserDict()
|
||||
userList.value = data
|
||||
userList.value = data.map((item) => ({ ...item, value: `${item.value}` }))
|
||||
})
|
||||
</script>
|
||||
|
||||
|
Reference in New Issue
Block a user