当前位置:   article > 正文

Vue3中实现聊天室界面滚动条默认滑动到最底部_发送消息的滚动条如何一直保持最底部

发送消息的滚动条如何一直保持最底部

1、背景:

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

 2、需求:

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

  1. //通过class绑定会话容器
  2. <div class= "height chatdoom"></div>
  3. <style>
  4. .height {
  5. height: 800px;
  6. }
  7. </style>

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

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

  1. const handleClickItem = (item: any, index: number) => {
  2. //...代码
  3. //实时滚动
  4. setTimeout(() => {
  5. scrollToBottom()
  6. }, 200)
  7. }

当发送了新消息后 

  1. // 滚动到底部
  2. const chatContent: any = ref(null)//装会话的容器
  3. const isScrolling = ref(false)//用于判断用户是否在滚动
  4. function scrollToBottom() {
  5. nextTick(() => {
  6. //注意要使用nexttick以免获取不到dom
  7. if (!isScrolling.value) {
  8. chatContent.value.scrollTop = chatContent.value.scrollHeight - chatContent.value.offsetHeight
  9. }
  10. })
  11. }
  12. function handleScroll() {
  13. const scrollContainer = chatContent.value
  14. const scrollTop = scrollContainer.scrollTop
  15. const scrollHeight = scrollContainer.scrollHeight
  16. const offsetHeight = scrollContainer.offsetHeight
  17. if (scrollTop + offsetHeight < scrollHeight) {
  18. // 用户开始滚动并在最底部之上,取消保持在最底部的效果
  19. isScrolling.value = true
  20. } else {
  21. // 用户停止滚动并滚动到最底部,开启保持到最底部的效果
  22. isScrolling.value = false
  23. }
  24. }
  25. // 创建一个连接
  26. var connection = new signalR.HubConnectionBuilder()
  27. //...
  28. // 监听到消息
  29. connection.on('ReceiveMessage', function (message, isOver, isFirst) {
  30. // 在监听到ai回复的地方调用滚动到底部方法
  31. scrollToBottom()
  32. })
  33. onMounted(async () => {
  34. await nextTick
  35. chatContent.value = document.getElementsByClassName('checkdom')[0]
  36. scrollToBottom()
  37. // 监听滚动事件,判断用户滚动状态
  38. chatContent.value.addEventListener('scroll', handleScroll)
  39. })

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/355541
推荐阅读
相关标签
  

闽ICP备14008679号