mirror of
				https://github.com/continew-org/continew-admin-ui.git
				synced 2025-10-31 10:57:10 +08:00 
			
		
		
		
	fix: 修复用户选择器数据重复选中的问题
This commit is contained in:
		| @@ -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] | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| }) | }) | ||||||
|   | |||||||
| @@ -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> | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 MoChou
					MoChou