vue3 处理鼠标滚轮上滑获取旧数据,下滑获取最新数据

template部分

<template>
  <div class="messageList" @wheel="handleWheel">
    <SmallLoading class="justify-end" v-if="isLoading"></SmallLoading>
    <el-scrollbar :always="true" ref="scrollbarRef">
      <div ref="innerRef">
        <div class="messageItem" v-for="item in messageList" :key="item.id">
          <div class="date">{{ timestampToTime(item.createTime) }}</div>
          <div class="flex items-center">
            <!-- 消息内容类型 0: 文字 1: 图文 2: 图片 3: 邀请加入组织 4: 申请加入组织 5: 平台掉线 6: 算力不足 7: 转接失败 -->
            <div class="message-content" v-if="item.messageContentType === 0">
              {{ item.messageContent }}
            </div>
            <div
              class="message-content"
              v-if="item.messageContentType === 1"
              v-html="item.messageContent"
            ></div>
            <div class="message-content" v-if="item.messageContentType === 2">
              <img :src="item.messageContent" alt="" />
            </div>
            <div
              class="isReceive mt-3 ml-3 flex justify-center items-center"
              v-if="
                item.messageContentType === 0 ||
                item.messageContentType === 1 ||
                item.messageContentType === 2
              "
            >
              <img src="@/assets/icons/88.svg" alt="" />
            </div>
            <div
              v-if="
                item.messageContentType !== 0 &&
                item.messageContentType !== 1 &&
                item.messageContentType !== 2
              "
              class="message-box"
            >
              <div class="messageTitle" v-if="item.messageContentType === 3">
                {{ parseJsonContent(item.messageContent) }} 邀请您加入协作
              </div>
              <div class="messageTitle" v-if="item.messageContentType === 4">
                {{ parseJsonContent(item.messageContent) }} 申请加入协作
              </div>
              <div class="messageTitle" v-if="item.messageContentType === 5">
                {{ parseJsonContent(item.messageContent) }} 拼多多账号掉线
              </div>
              <div class="messageTitle" v-if="item.messageContentType === 6">
                您的算力不足 请购买算力
              </div>
              <div class="messageTitle" v-if="item.messageContentType === 7">
                子账号{{ parseJsonContent(item.messageContent) }}转接失败
              </div>
              <div
                class="buttons flex justify-center"
                v-if="item.messageContentType === 4 || item.messageContentType === 3"
              >
                <div
                  class="Cancel"
                  :class="item.dealFlag ? 'info' : ''"
                  @click="changeCancel(item)"
                >
                  拒绝
                </div>
                <div
                  class="Confirm"
                  :class="item.dealFlag ? 'info' : ''"
                  @click="changeIsAgree(item)"
                >
                  同意
                </div>
              </div>
              <div
                class="buttons flex justify-center"
                v-else-if="
                  item.messageContentType === 5 ||
                  item.messageContentType === 6 ||
                  item.messageContentType === 7
                "
              >
                <div
                  class="Cancel"
                  :class="item.ignoreFlag ? 'info' : ''"
                  @click="changeCancel(item)"
                >
                  忽略
                </div>
                <div
                  class="Confirm"
                  :class="item.ignoreFlag ? 'info' : ''"
                  @click="changeIsChecked(item)"
                >
                  查看
                </div>
              </div>
            </div>
            <div
              v-if="
                item.messageContentType !== 0 &&
                item.messageContentType !== 1 &&
                item.messageContentType !== 2
              "
              class="isReceive mt-14 ml-3 flex justify-center items-center"
            >
              <img src="@/assets/icons/88.svg" alt="" />
            </div>
          </div>
        </div>
      </div>
    </el-scrollbar>
  </div>
</template>

script部分:

import { throttle } from 'lodash'

const scrollbarRef = ref(null)

// 获取消息列表Api timeVector : 0、新数据   1、旧数据
const getMessageListApi = (messageId = '0', timeVector = 0) => {
  if (isRequesting.value) return // 避免重复请求
  isRequesting.value = true // 开始请求,设置标志变量为true
  getMessageList({ messageId, timeVector })
    .then(res => {
      if (res.code === BusinessCode.Success) {
        isLoading.value = false
        if (res.data) {
          res.data.forEach(item => {
            message.changeMessageList(item)
          })
          messageList.value = message.messageList
        } else {
          ElMessage.warning('暂无消息')
        }
      } else {
        // 否则,显示警告消息
        ElMessage.warning(res.msg)
      }
      isRequesting.value = false // 请求结束,重置标志变量为false
    })
    .catch(() => {
      isRequesting.value = false // 请求失败也需重置标志变量
    })
}
let time = null
// 处理鼠标滚轮事件
const handleWheel = throttle(event => {
  clearTimeout(time)
  const scrollTop = scrollbarRef.value.wrapRef.scrollTop
  const scrollHeight = scrollbarRef.value.wrapRef.scrollHeight
  const clientHeight = scrollbarRef.value.wrapRef.clientHeight
  if (event.deltaY > 0 && scrollTop + clientHeight >= scrollHeight - 10) {
    // 滚动到底部时,加载更多消息
    isLoading.value = true
    time = setTimeout(() => {
      getMessageListApi(message.messageList[message.messageList.length - 1].messageId, 0)
    }, 1000)
  } else if (event.deltaY < 0 && scrollTop < 1) {
    isLoading.value = true
    time = setTimeout(() => {
      getMessageListApi(message.messageList[0].messageId, 1)
    }, 1000)
  }
}, 300) // 节流间隔设置为300毫秒

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3中,要获取原始数据,可以使用`$refs`来引用组件或DOM元素,并通过访问其内部数据属性来获取原始数据。 首先,在Vue实例中定义一个 `ref` 属性来引用要获取原始数据的组件或DOM元素。例如,我们定义一个`ref`属性名为`myComponent`来引用一个组件或DOM元素。在Vue 3中,我们可以使用新的 `ref` 函数来创建一个引用,如下所示: ```javascript import { ref } from 'vue'; const myComponent = ref(null); export default { setup() { return { myComponent }; }, }; ``` 然后,在模板中,我们可以通过在组件或DOM元素上添加`ref`指令来将该属性与实际的组件或DOM元素进行绑定。例如,我们将指令绑定到一个组件上: ```html <template> <my-component ref="myComponent"></my-component> </template> ``` 现在,我们就可以通过访问`myComponent`的`value`属性来获取原始数据了。在Vue 3中,我们可以使用`value`属性来访问引用的实际值。例如,我们可以通过`myComponent.value`来获取组件的原始数据: ```javascript const originalData = myComponent.value.data; ``` 同样地,我们也可以通过访问DOM元素的原始属性来获取原始数据。例如,我们可以通过`myComponent.value.textContent`来获取DOM元素的文本内容。 总结而言,在Vue 3中,我们可以使用`$refs`来获取原始数据,通过创建和引用`ref`属性,然后通过访问`value`属性来获取组件或DOM元素的原始数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值