gaoluyang
2026-06-29 27cd042df9aca0383a49f3514bc21958dd890912
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<script lang="ts" setup>
import type { GroupMemberLite } from './group-member.vue'
 
import { ImFriendAddSource } from '../../../utils/constants'
import { UserAvatar } from '../user'
 
defineOptions({ name: 'ImGroupMemberGrid' })
 
withDefaults(
  defineProps<{
    clickable?: boolean // 头像点击是否弹 UserInfoCard;选择器宫格里需要保持关闭,避免和勾选交互冲突
    groupName?: string // 群名:加好友时拼「我是 'XX 群' 的 YY」话术,落库 add_source=GROUP
    member: GroupMemberLite
    size?: number // 头像像素大小;默认 38(兼容选择器右侧已选区),群信息抽屉传 50 对齐微信 PC
  }>(),
  {
    clickable: false,
    size: 38,
    groupName: ''
  }
)
</script>
 
<template>
  <!--
    群成员宫格单元
    - 宫格展示的最小单位:头像在上、名字在下;列宽 = size + 16,自适应 size 留呼吸空间
    - 被 GroupMemberPickerPanel 右侧已选区(grid 形态)、ConversationGroupSide 群成员区循环使用
  -->
  <div
    class="relative flex flex-col items-center px-0.5 py-1"
    :style="{ width: `${size! + 16}px` }"
  >
    <UserAvatar
      :id="member.userId"
      :url="member.avatar"
      :name="member.nickname"
      :size="size"
      :clickable="clickable"
      :add-source="ImFriendAddSource.GROUP"
      :add-source-extra="groupName"
    />
    <div
      class="w-full mt-1 overflow-hidden text-12px leading-[18px] text-center truncate text-[var(--ant-color-text)]"
    >
      {{ member.showName }}
    </div>
    <slot></slot>
  </div>
</template>