fix: 修复用户选择器数据重复选中的问题

This commit is contained in:
MoChou
2024-11-16 19:19:06 +08:00
parent 5637ae50b9
commit 5de731dab4
2 changed files with 33 additions and 28 deletions

View File

@@ -60,7 +60,7 @@
<a-col :span="24" :md="6" class="section"> <a-col :span="24" :md="6" class="section">
<a-card> <a-card>
<template #title>已选择: {{ selectedKeys.length }}</template> <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 }"> <template #nickname="{ record }">
{{ record.nickname }}({{ record.username }}) {{ record.nickname }}({{ record.username }})
</template> </template>
@@ -154,7 +154,7 @@ const reset = () => {
// 选中用户 ID // 选中用户 ID
const selectedKeys = ref<string[]>([]) const selectedKeys = ref<string[]>([])
// 选中用户信息 // 选中用户信息
const selectedData = ref<UserResp[]>([]) const selectedData = ref<Map<string, UserResp>>(new Map())
const emitSelectUser = () => { const emitSelectUser = () => {
emit('select-user', selectedKeys.value) emit('select-user', selectedKeys.value)
@@ -163,24 +163,21 @@ const emitSelectUser = () => {
// 单选 // 单选
const onSelect = (rowKeys: string[], rowKey: string, record: UserResp) => { const onSelect = (rowKeys: string[], rowKey: string, record: UserResp) => {
if (props.multiple) { if (props.multiple) {
// 多选
if (rowKeys.includes(rowKey)) { if (rowKeys.includes(rowKey)) {
// 包含 选中 // 选中时,添加到 Map
selectedData.value.push(record) selectedData.value.set(rowKey, record)
selectedKeys.value?.push(rowKey) selectedKeys.value = Array.from(selectedData.value.keys())
} else { } else {
// 不包含 去 // 取消选中时,从 Map 移
selectedData.value = selectedData.value.filter((item) => item.id !== rowKey) selectedData.value.delete(rowKey)
selectedKeys.value?.splice(selectedKeys.value?.indexOf(rowKey), 1) selectedKeys.value = Array.from(selectedData.value.keys())
} }
} else { } else {
// 单选 selectedData.value.clear()
selectedData.value = []
selectedKeys.value = [] selectedKeys.value = []
if (rowKeys.includes(rowKey)) { if (rowKeys.includes(rowKey)) {
// 包含 选中 selectedData.value.set(rowKey, record)
selectedData.value.push(record) selectedKeys.value = [rowKey]
selectedKeys.value?.push(rowKey)
} }
} }
emitSelectUser() emitSelectUser()
@@ -189,31 +186,31 @@ const onSelect = (rowKeys: string[], rowKey: string, record: UserResp) => {
// 全选 // 全选
const onSelectAll = (checked: boolean) => { const onSelectAll = (checked: boolean) => {
if (checked) { if (checked) {
// 选中 // 全选时,将所有数据添加到 Map
dataList.value.forEach((item) => { dataList.value.forEach((item) => {
selectedData.value.push(item) selectedData.value.set(item.id, item)
selectedKeys.value?.push(item.id)
}) })
selectedKeys.value = Array.from(selectedData.value.keys())
} else { } else {
// 取消选中 // 取消全选时,清空 Map
dataList.value.forEach((item) => { dataList.value.forEach((item) => {
selectedData.value = selectedData.value.filter((i) => i.id !== item.id) selectedData.value.delete(item.id)
selectedKeys.value?.splice(selectedKeys.value?.indexOf(item.id), 1)
}) })
selectedKeys.value = Array.from(selectedData.value.keys())
} }
emitSelectUser() emitSelectUser()
} }
// 从选中列表中移除用户 // 从选中列表中移除用户
const handleDeleteSelectedUser = (user: UserResp) => { const handleDeleteSelectedUser = (user: UserResp) => {
selectedData.value = selectedData.value.filter((i) => i.id !== user.id) selectedData.value.delete(user.id)
selectedKeys.value?.splice(selectedKeys.value?.indexOf(user.id), 1) selectedKeys.value = Array.from(selectedData.value.keys())
emitSelectUser() emitSelectUser()
} }
// 清空所有选中数据 // 清空所有选中数据
const onClearSelected = () => { const onClearSelected = () => {
selectedData.value = [] selectedData.value.clear()
selectedKeys.value = [] selectedKeys.value = []
emitSelectUser() emitSelectUser()
} }
@@ -234,11 +231,19 @@ onMounted(async () => {
if (props.value && props.value.length > 0) { if (props.value && props.value.length > 0) {
const { data } = await listAllUser({ userIds: props.value }) const { data } = await listAllUser({ userIds: props.value })
if (props.multiple) { if (props.multiple) {
selectedData.value = data.filter((item) => props.value.includes(item.id)) // 使用 Map 存储用户,避免重复
selectedKeys.value = Array.from(selectedData.value).map((user) => user.id) data.forEach((item) => {
if (props.value.includes(item.id)) {
selectedData.value.set(item.id, item)
}
})
selectedKeys.value = Array.from(selectedData.value.keys())
} else { } else {
selectedData.value = data.filter((item) => props.value[0] === item.id) const user = data.find((item) => props.value[0] === item.id)
selectedKeys.value = Array.from(selectedData.value).map((user) => user.id) if (user) {
selectedData.value.set(user.id, user)
selectedKeys.value = [user.id]
}
} }
} }
}) })

View File

@@ -201,7 +201,7 @@ onMounted(async () => {
} }
// 获取所有用户 // 获取所有用户
const { data } = await listUserDict() const { data } = await listUserDict()
userList.value = data userList.value = data.map((item) => ({ ...item, value: `${item.value}` }))
}) })
</script> </script>