123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- <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>
|