9433cfb9创建于 2025年12月31日历史提交
<template>
  <view style="flex:1">
    <scroll-view :show-scrollbar="false" :scroll-with-animation="true" style="flex: 1;padding-bottom: 10px;">
      <list-view ref="messageView" @scrolltoupper="clearData" @scrolltolower="loadData" :scroll-with-animation="true"
        :show-scrollbar="false" style="flex: 1;transform: rotate(180deg)">
        <list-item v-for="(item, index) in messageList" @longpress="listItemLongPress(index)" :key="`listItem${index}`"
          :id="`listItem${item.id}`" style="transform: rotate(180deg);padding: 10px 12px;" type="0">
          <view class="left-row">
            <image :fade-show="true" :src="item.avatar"
              :style="{width: `${avatarWidth}px`,height: `${avatarWidth}px`,borderRadius: `${avatarWidth}px`}"></image>
            <view :id="`listItemContent${item.id}`" class="flex-row content"
              style="padding: 9px 11px 9px 11px;border-radius: 7px;align-items: center;margin-left: 8px;background-color: #3c99ff;">
              <text style="font-size: 13px;line-height: 20px;color:#fff;">
                {{ item.content }}
              </text>
            </view>
            <view style="flex: 1;">
            </view>
          </view>

        </list-item>
        <list-item slot="load-more" type="3" class="loading">
          <uni-loading :loading="loading" color="#999"></uni-loading>
        </list-item>
      </list-view>
    </scroll-view>
  </view>
</template>

<script setup lang="uts">
  type MessageItem = {
    id : number;
    avatar : string;
    left : boolean;
    content : string;
    height : number;
  }

  const messageView = ref<UniElement | null>(null)
  const bottom = ref<UniElement | null>(null)
  const avatarWidth = ref(38)
  const scrollTop = ref(0)
  const message = ref('')
  const showBottom = ref(false)
  const isFocus = ref(false)
  const loading = ref(false)
  const audio = ref(false)
  const recording = ref(false)
  const messageList = ref<MessageItem[]>([])

  const screenWidth = computed(() : number => {
    return 1080
  })
  const clearData = () => {
    if (messageList.value.length >= 40) {
      messageList.value.splice(39, messageList.value.length - 1)
    }
  }

  const listItemLongPress = (index : number) => {
    uni.showToast({
      title: '触发长按:' + index,
      position: "bottom"
    })
  }

  const loadData = () => {
    loading.value = true
    setTimeout(() => {
      loading.value = false
      let length = messageList.value.length
      for (let i = 0; i < 20; i++) {
        let item = {
          id: length + i,
          avatar: "/static/uni.png",
          left: true,
          content: '这是一些占位消息',
          height: 0
        } as MessageItem
        messageList.value.push(item)
      }
    }, 800)
  }
  const getMessage = () => {
    let idList : number[] = []
    for (let index = 0; index < 20; index++) {
      let item = {
        id: index,
        avatar: '/static/uni.png',
        left: false,
        content: `这是一条消息${index}`,
        height: 0
      } as MessageItem
      messageList.value.push(item)
      idList.push(item.id)
    }
  }
  onReady(() => {
    getMessage()
  })
</script>

<style scoped>
  .flex-row {
    display: flex;
    flex-direction: row;
  }

  .left-row {
    flex-direction: row-reverse;
  }

  .content {
    margin: 0 8px;
  }

  .loading {
    height: 60px;
    justify-content: center;
    align-items: center;
  }
</style>