manage-member.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <template>
  2. <main class="member">
  3. <ul class="list">
  4. <li class="list-item" v-for="(item, index) in list" :key="index">
  5. <aside>
  6. <img
  7. class="avatar"
  8. :src="
  9. item?.avatar ||
  10. 'https://web.sdk.qcloud.com/component/TUIKit/assets/avatar_21.png'
  11. "
  12. onerror="this.src='https://web.sdk.qcloud.com/component/TUIKit/assets/avatar_21.png'"
  13. />
  14. <span class="name">{{ item?.nick || item?.userID }}</span>
  15. <span>{{ handleRoleName(item) }}</span>
  16. </aside>
  17. <i
  18. v-if="item.role !== 'Owner' && isShowDel"
  19. class="icon icon-del"
  20. @click="submit(item)"
  21. ></i>
  22. </li>
  23. <li class="list-item" v-if="list.length < total" @click="getMore">
  24. 查看更多
  25. </li>
  26. </ul>
  27. </main>
  28. </template>
  29. <script lang="ts">
  30. import { defineComponent, watchEffect, reactive, toRefs } from "vue";
  31. const ManageMember = defineComponent({
  32. components: {},
  33. props: {
  34. list: {
  35. type: Array,
  36. default: () => [],
  37. },
  38. total: {
  39. type: Number,
  40. default: () => 0,
  41. },
  42. isShowDel: {
  43. type: Boolean,
  44. default: () => false,
  45. },
  46. self: {
  47. type: Object,
  48. default: () => ({}),
  49. },
  50. },
  51. setup(props: any, ctx: any) {
  52. const types: any = uni.$TIM.TYPES;
  53. const data: any = reactive({
  54. total: 0,
  55. list: [],
  56. isShowDel: false,
  57. self: {},
  58. });
  59. watchEffect(() => {
  60. data.total = props.total;
  61. data.isShowDel = props.isShowDel;
  62. data.list = props.list;
  63. data.self = props.self;
  64. });
  65. const handleRoleName = (item: any) => {
  66. let name = "";
  67. switch (item?.role) {
  68. case types.GRP_MBR_ROLE_ADMIN:
  69. name = "管理员";
  70. break;
  71. case types.GRP_MBR_ROLE_OWNER:
  72. name = "群主";
  73. default:
  74. break;
  75. }
  76. if (name) {
  77. name = name;
  78. }
  79. if (item.userID === data.self.userID) {
  80. name += "我";
  81. }
  82. return name;
  83. };
  84. const getMore = () => {
  85. ctx.emit("more");
  86. };
  87. const submit = (item: any) => {
  88. ctx.emit("del", [item]);
  89. };
  90. return {
  91. ...toRefs(data),
  92. getMore,
  93. submit,
  94. handleRoleName,
  95. };
  96. },
  97. });
  98. export default ManageMember;
  99. </script>
  100. <style lang="scss" scoped>
  101. .member {
  102. flex: 1;
  103. background: #ffffff;
  104. .list {
  105. display: flex;
  106. flex-direction: column;
  107. background: #f4f5f9;
  108. padding-top: 22px;
  109. &-item {
  110. padding: 13px;
  111. display: flex;
  112. justify-content: space-between;
  113. align-items: center;
  114. background: #ffffff;
  115. font-size: 14px;
  116. &:hover {
  117. background: #f1f2f6;
  118. }
  119. aside {
  120. display: flex;
  121. align-items: center;
  122. .name {
  123. padding-left: 8px;
  124. font-weight: 400;
  125. font-size: 14px;
  126. color: #000000;
  127. }
  128. }
  129. }
  130. }
  131. }
  132. .avatar {
  133. width: 36px;
  134. height: 36px;
  135. border-radius: 4px;
  136. }
  137. </style>