messageList.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <template>
  2. <view class="msg_list_content">
  3. <uni-collapse>
  4. <uni-collapse-item title-border="show" :border="true" :show-animation="anime" :open="open">
  5. <template v-slot:title>
  6. <uni-section :title="title" type="line" titleFontSize="1.5rem"></uni-section>
  7. </template>
  8. <View style="height: 85vh">
  9. <z-paging :fixed="false" @query="queryData" :value="messages" :default-page-size="pSize"
  10. :default-page-no="pageNo" ref="paging">
  11. <template #top>
  12. <view v-if="props.segments" class="segmented_control_container">
  13. <uni-segmented-control :current="current" :values="segmentKeys" @clickItem="onClickItem"
  14. styleType="text" activeColor="#409eff"></uni-segmented-control>
  15. </view>
  16. </template>
  17. <view @click="handleToDetail(message)" v-for="(message, index) in messages" :key="index"
  18. :class="message.isread == 'Y' || message.if_read ? ' ' : 'message_container_unread'"
  19. class="message_container">
  20. <uni-card :is-full="true">
  21. <template v-slot:title>
  22. <uni-row>
  23. <view class="message_top_container">
  24. <uni-col :span="24">
  25. <text class="message_user">
  26. {{ message.name }}
  27. </text>
  28. </uni-col>
  29. </view>
  30. </uni-row>
  31. <uni-row>
  32. <view class="message_mid_container">
  33. <uni-col :span="19">
  34. <text class="message_title hidden_over">
  35. <text :class="message.icon" class="ygoa-icon"></text>
  36. <text class="message_title_text">{{ message.title }}</text>
  37. </text>
  38. </uni-col>
  39. <uni-col :span="5">
  40. <view class="message_time"
  41. v-for="(item, index) in message.sendtime.split(' ')" :key="index">
  42. {{ item }}
  43. </view>
  44. </uni-col>
  45. </view>
  46. </uni-row>
  47. </template>
  48. <view v-if="message.content" class="message_bottom_container">
  49. <text class="message_content hidden_over">
  50. {{ message.content }}
  51. </text>
  52. </view>
  53. </uni-card>
  54. </view>
  55. </z-paging>
  56. </View>
  57. </uni-collapse-item>
  58. </uni-collapse>
  59. </view>
  60. </template>
  61. <script setup lang="ts">
  62. import { onMounted, ref } from 'vue';
  63. const current = ref(0)
  64. const props = defineProps({
  65. anime: Boolean, // 是否开启动画
  66. open: Boolean, // 是否默认打开
  67. title: String, // 标题
  68. segments: Array, // 分段器数据
  69. messages: Array, // 消息数据
  70. pSize: Number, // 分页大小
  71. pageNo: Number // 默认页
  72. })
  73. const emits = defineEmits([
  74. 'clickSegment', // 点击分段器
  75. 'clickItem', // 点击内容项
  76. 'scrollToBottom' // 到达底部
  77. ])
  78. // 分段器 键值
  79. const segmentKeys = ref({})
  80. const segmentValues = ref({})
  81. onMounted(() => {
  82. if (props.segments !== undefined) {
  83. segmentKeys.value = Object.keys(props.segments)
  84. segmentValues.value = Object.values(props.segments)
  85. }
  86. })
  87. const paging = ref(null)
  88. // 加载完成 更新数据
  89. function complete(list) {
  90. paging.value.complete(list)
  91. }
  92. // 点击分段器
  93. function onClickItem({ currentIndex }) {
  94. current.value = currentIndex
  95. // 重新加载数据 pageNo恢复为默认值
  96. paging.value.reload()
  97. }
  98. // 刷新
  99. function queryData(pageNo, pSize, queryType) {
  100. switch (queryType) {
  101. case 0: // 下拉刷新
  102. case 1: // 初始加载
  103. reloadData()
  104. break
  105. case 3: // 上拉加载
  106. scrollQuery(pageNo, pSize)
  107. break
  108. default: // 默认刷新
  109. reloadData()
  110. break
  111. }
  112. }
  113. // 刷新数据
  114. function reloadData() {
  115. const params = {
  116. pSize: props.pSize,
  117. pageNo: props.pageNo,
  118. type: '',
  119. segmentValue: segmentValues.value[current.value]
  120. }
  121. emits('clickSegment', params, complete)
  122. }
  123. // 上拉加载
  124. function scrollQuery(pageNo, pSize) {
  125. const params = {
  126. pSize,
  127. pageNo,
  128. type: '',
  129. segmentValue: segmentValues.value[current.value]
  130. }
  131. emits('scrollToBottom', params, complete)
  132. }
  133. // 跳转详情
  134. function handleToDetail(message) {
  135. emits('clickItem', message)
  136. }
  137. </script>
  138. <style lang="scss">
  139. .hidden_over {
  140. white-space: nowrap; // 不换行
  141. overflow: hidden; // 超出内容隐藏
  142. text-overflow: ellipsis; // 超出部分显示省略号
  143. display: inline-block;
  144. max-width: 100%;
  145. }
  146. .msg_list_content {
  147. .message_container {
  148. border-left: #7b7b7b .4rem solid;
  149. .message_top_container {
  150. padding: 5px 5px 0;
  151. .message_user {
  152. color: #000000;
  153. }
  154. }
  155. .message_mid_container {
  156. padding: 5px;
  157. height: 1.1rem;
  158. .message_title {
  159. font-size: 1.1rem;
  160. }
  161. .message_time {
  162. font-size: 0.8rem;
  163. }
  164. }
  165. .message_bottom_container {
  166. .message_content {}
  167. }
  168. }
  169. .message_container_unread {
  170. // 未读样式
  171. border-left-color: #0f6cbd;
  172. .message_user {
  173. color: #000000;
  174. font-weight: bold;
  175. }
  176. .message_mid_container {
  177. .message_title {
  178. color: #0f6cbd;
  179. .message_title_text {
  180. font-weight: bold;
  181. }
  182. }
  183. }
  184. }
  185. }
  186. </style>