Vue3中实现聊天室界面滚动条默认滑动到最底部

1、背景:

实现一个类似于chatGpt的聊天界面,左侧具有创建会话以及聊天记录列表界面,如图:

 2、需求:

用户单击左侧聊天记录列表,以及新发送消息,右侧会话历史滚动条需要实时保持在聊天记录最底部,并且当用户滚动滚动条时,取消滚动到底部的效果(避免页面抖动),当用户再次将滚动条滚动到底部时,再次触发滚动到底部效果

//通过class绑定会话容器
<div class= "height chatdoom"></div>
<style>
    .height {
        height: 800px;
    }
</style>

3、只需要封装方法,在需要触发会话界面的地方调用即可

当点击左侧会话历史时,右侧内容需要保持到最底部

const handleClickItem = (item: any, index: number) => {
  //...代码
  //实时滚动
  setTimeout(() => {
    scrollToBottom()
  }, 200)
}

当发送了新消息后 

// 滚动到底部
const chatContent: any = ref(null)//装会话的容器
const isScrolling = ref(false)//用于判断用户是否在滚动
function scrollToBottom() {
  nextTick(() => {
    //注意要使用nexttick以免获取不到dom
    if (!isScrolling.value) {
      chatContent.value.scrollTop = chatContent.value.scrollHeight - chatContent.value.offsetHeight
    }
  })
}
function handleScroll() {
  const scrollContainer = chatContent.value
  const scrollTop = scrollContainer.scrollTop
  const scrollHeight = scrollContainer.scrollHeight
  const offsetHeight = scrollContainer.offsetHeight

  if (scrollTop + offsetHeight < scrollHeight) {
    // 用户开始滚动并在最底部之上,取消保持在最底部的效果
    isScrolling.value = true
  } else {
    // 用户停止滚动并滚动到最底部,开启保持到最底部的效果
    isScrolling.value = false
  }
}

// 创建一个连接
var connection = new signalR.HubConnectionBuilder()
    //...


// 监听到消息
connection.on('ReceiveMessage', function (message, isOver, isFirst) {
  
 
  // 在监听到ai回复的地方调用滚动到底部方法
  scrollToBottom()
  
})

onMounted(async () => {
  await nextTick
 
  chatContent.value = document.getElementsByClassName('checkdom')[0]

  scrollToBottom()
  // 监听滚动事件,判断用户滚动状态
  chatContent.value.addEventListener('scroll', handleScroll)
})

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值