消息会话—发送消息自动滚动到最底部

背景

在项目开发中,实现用户友好的输入交互是提升用户体验的关键之一。例如,在消息会话页面中,为了确保用户在发送新消息后页面能自动滚动到最底部,从而始终保持最新消息的可见性,需要实现自动滚动功能。这不仅提升了用户体验,还使得用户能够实时关注对话的最新进展。

实现思路

  • 监听消息列表的变化
  • 在消息变化后自动滚动到最底部

示例代码

组件结构如下

<template><div><el-dialog width="68%" :visible.sync="isShow" :before-close="close" class="kefu" :show-close="false":close-on-click-modal="false"><div class="kefu-con"><i class="el-icon-close close" @click="close" /><div class="header"><img :src="kefuImg" alt=""><div class="title">小奶龙智能问答助手</div></div><div class="container" ref="container"><div class="content" ref="content"><div v-for="item in messageForm"><div class="reply-container" v-if="item.type === 'reply'"><div class="reply-content"><div class="img-con"><img :src="kefuImg" alt=""></div><div class="reply" @click="handleProxyClick"><div v-if="item.isXml" v-html="item.content"></div><p v-else>{{ item.content }}</p></div></div></div><div class="qs-container" v-if="item.type === 'qs'"><div class="qs-content"><div class="qs"><p>{{ item.content }}</p></div></div></div></div></div></div><div class="footer"><img :src="kefuImg" alt=""><div class="question-con"><el-input class="ipt" v-model="question" placeholder="请输入想咨询的问题"></el-input><el-button class="btn" type="warning" round @click="send">发送</el-button></div></div></div></el-dialog></div>
</template><script>
import { getAnswer } from '@/api/checkin.js';
export default {data() {return {isShow: false,kefuImg: require("@/assets/images/headshot.png"),question: '',messageForm: [{content: "<p>您好, 我是您的小奶龙,你的智能助手。 你可以问我编码相关的问题,也可以一起更高效、更高质量地完成编码工作。比如 “<span class='quick' style='color: #5094d5;cursor: pointer;' @click='quick'>动态路由实现</span>”, “<span class='quick' style='color: #5094d5;cursor: pointer;' @click='quick'>移动端适配</span>” 等等一些问题。</p>",type: "reply", // reply 回答  qs 问题isXml: true,},{content: '动态路由实现',type: "qs", // reply 回答  qs 问题isXml: false,}]}},methods: {handleProxyClick(event) {// 获取触发事件的目标元素  event 事件对象const target = event.target;// 判断目标元素是否包含指定类名if (target.classList.contains('quick')) {// 传递目标元素的文本内容this.quick(target.outerText);}},quick(text) {console.log('quick方法触发了::: ');this.question = text;// 发送this.send();},show() {this.isShow = true;},close() {this.isShow = false;},send() {let NewQuestion = this.question.trim();if (NewQuestion === '') {return;}this.messageForm.push({content: NewQuestion,type: 'qs',isXml: false,});setTimeout(() => {this.question = '';})},},
}
</script>

发送消息不滚动到最底部
在这里插入图片描述

解决方法

获取对话框内容 DOM 元素,将滚动容器的滚动条位置设置为其最大高度,从而使滚动容器自动滚动到最底部

container.scrollTop

  • 获取当前滚动容器的垂直滚动距离。

  • 设置 scrollTop 的值可以改变滚动容器的滚动位置。

  • 如果 scrollTop 设置为 0,则滚动到顶部;如果设置为某个较大的值,则滚动到对应的位置。

container.scrollHeight

  • 获取滚动容器的总高度(包括不可见部分)。

  • scrollTop 设置为 scrollHeight 时,滚动容器会滚动到最底部。

 // 获取内容容器
const content = this.$refs.content;this.$refs.container.scrollTo(0, content.scrollHeight);

效果如下

在这里插入图片描述

当异步接口返回时,插入的内容不会滚动到最底部,我们需要使用 this.$nextTick() 函数,该函数会等待 DOM 更新完成后才调用

export default {methods: {send() {let NewQuestion = this.question.trim();if (NewQuestion === '') {return;}this.messageForm.push({content: NewQuestion,type: 'qs',isXml: false,});setTimeout(() => {// 模拟异步请求this.messageForm.push({content: '11111',type: 'reply',isXml: false,});this.question = '';this.$nextTick(() => {// 滚动到底部this.scrollToBottom();})})},scrollToBottom() {const content = this.$refs.content;this.$refs.container.scrollTo(0, content.scrollHeight);}}
}

效果如下
在这里插入图片描述

总结

在设计实现消息会话页面时,为确保每次发送新消息后,页面自动滚动至底部,关键在于利用 Vue 的响应式特性结合 DOM 操作技巧。具体策略为:当消息列表数据更新后,利用 this.$nextTick() 确保 DOM 已完成更新,随后设置容器的 scrollTop 属性等于 scrollHeight,从而使页面平滑地滚动到消息区域的最底部,以此提升用户体验,保证用户始终能便捷地查看最新的聊天内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/455764.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot集成:高效论坛网站的构建

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理论坛网站的相关信息成为必然。开发合适的论…

【GISBox使用指南】免费实现影像切片的工具,还支持多种格式服务发布!

一、什么是影像数据&#xff1f; 在地理信息系统中&#xff0c;影像数据是指通过遥感技术、摄影测量或其他成像手段获取的&#xff0c;以数字形式存储的地理空间图像信息。这些数据涵盖了从卫星遥感影像、航空摄影影像到地面摄影影像等多种类型&#xff0c;在GIS中的应用广泛而…

知乎付费投流怎么做?如何投放知乎广告?

知识经济背景下&#xff0c;知乎凭借其高质量的内容和精准的用户群体&#xff0c;成为了品牌营销的新蓝海。作为国内领先的知识分享平台&#xff0c;知乎汇聚了大量高学历、高收入、高消费能力的用户&#xff0c;他们对新知识、新产品有着强烈的好奇心和探索欲&#xff0c;是品…

成功解决pycharm软件中按住Ctrl+点击指定函数却不能跳转到对应库中的源代码

成功解决pycharm软件中按住Ctrl点击指定函数却不能跳转到对应库中的源代码 目录 解决问题 解决方法 解决问题 在pycharm软件中按住Ctrl点击指定函数却不能跳转到对应库中的源代码 解决方法

github pages + hugo 搭建静态博客网站

体验地址 1. 起因&#xff0c; 目的: 其实6年前&#xff0c;我就写过这个。 项目代码 博客地址 最近想改写一下。 github 推荐的主题是 Jekyll&#xff0c; 我当时用的就是这个&#xff0c;感觉很麻烦。尤其是文章命名。 新的主题 hugo 用起来还行。 2.过程: 过程记录&am…

比较相同机器上 redis和mysql分别单独承载的 最大连接数量

在相同的机器上&#xff0c;Redis 和 MySQL 的最大连接数量会受到硬件配置&#xff08;如 CPU、内存、网络等&#xff09;、配置参数和应用场景的影响。以下是对 Redis 和 MySQL 在单机环境下最大连接数的比较&#xff1a; Redis 最大连接数量 默认配置&#xff1a; Redis 默…

轻松掌握Win10录屏技巧:四大神器推荐!

在Win10系统中&#xff0c;录屏功能的应用越来越广泛&#xff0c;无论是用于工作演示、在线教学还是游戏分享&#xff0c;一款好用的录屏软件都是必不可少的。今天&#xff0c;我们将推荐四款录屏工具&#xff01; 福昕录屏大师 直达链接&#xff1a;www.foxitsoftware.cn/RE…

iOS--利用UITableViewDataSourcePrefetching实现平滑如丝的无限滚动

前言&#xff1a; 相信大家在网络不好的时候使用列表分页的App会获得非常不好的体验&#xff0c;由于网络的问题&#xff0c;会有明显的卡顿&#xff0c;就像抖音等App&#xff0c;那么我们是否能使用一些手段来优化这个体验呢&#xff1f;这里可以用到UITableView中另一个协议…

Linux Debian12基于ImageMagick图像处理工具编写shell脚本用于常见图片png、jpg、jpeg、tiff格式批量转webp格式

在Linux系统中&#xff0c;使用ImageMagick可以图片格式转换&#xff0c;其中最常用的是通过命令行工具进行。 ImageMagick是一个非常强大的图像处理工具集&#xff0c;它包含了许多用于图像转换的命令。 一、安装ImageMagick&#xff08;如果尚未安装&#xff09;&#xff1…

蓝牙资讯|iOS 18.1 正式版下周推送,AirPods Pro 2耳机将带来助听器功能

苹果公司宣布将在下周发布 iOS 18.1 正式版&#xff0c;同时确认该更新将为 AirPods Pro 2 耳机带来新增“临床级”助听器功能。在启用功能后&#xff0c;用户首先需要使用 AirPods 和 iPhone 进行简短的听力测试&#xff0c;如果检测到听力损失&#xff0c;系统将创建一项“个…

MoCoOp: Mixture of Prompt Learning for Vision Language Models

文章汇总 当前的问题 1)数据集风格变化。 如图1所示&#xff0c;对于一个数据集&#xff0c;单个软提示可能不足以捕获数据中呈现的各种样式。同一数据集中的不同实例可能与不同的提示符兼容。因此&#xff0c;更**自然的做法是使用多个提示来充分表示这些变化**。 2)过拟合…

101. UE5 GAS RPG 实现范围技能奥术爆发表现

在上一篇文章里&#xff0c;我们实现了范围技能的范围指示功能。范围指示是在释放技能前&#xff0c;确认技能的攻击范围&#xff0c;在确认位置后&#xff0c;通过额外按键进行触发技能释放。 在这一篇里&#xff0c;我们将先实现在技能里使用范围指示&#xff0c;并能够播放对…

硬件基础知识补全计划【一】电阻

一、电阻理论 1.1 电流定义 电流&#xff1a;电流的强弱用电流强度来描述&#xff0c;电流强度是单位时间内通过导体某一横截面的电荷量&#xff0c;简称电流&#xff0c;用I表示。1 秒内有 6.241509310^18 个元电荷通过横截面的电流&#xff0c;定义为 1 安 (A)。 电压&…

Redis Search系列 - 第四讲 支持中文

目录 一、支持中文二、自定义中文词典2.1 Redis Search设置FRISOINI参数2.2 friso.ini文件相关配置1&#xff09;自定义friso UTF-8字典2&#xff09;修改friso.ini配置文件 三、实测中文分词效果 一、支持中文 Redis Stack 从版本 0.99.0 开始支持中文文档的添加和分词。中文…

MoeCTF 2024 ---Misc方向WP

安全杂项 signin 题目描述&#xff1a; xdsec的小伙伴们和参赛者来上课&#xff0c;碰巧这一天签到系统坏了&#xff0c;作为老师的你&#xff0c;要帮他们 教师代签。 特殊提醒&#xff1a;luo同学今天好像在宿舍打游戏&#xff0c;不想来上课&#xff0c;这是严重的缺勤行为…

PoissonRecon学习笔记

1. Screened Poisson Reconstruction (SPR) 源码&#xff1a;https://github.com/mkazhdan/PoissonRecon However, as noted by several researchers, it suffers from a tendency to over-smooth the data. 泊松重建存在过度平滑的现象。 方法&#xff1a;position and gradi…

【QT】QChart绘制曲线与散点图

功能描述:绘制曲线和散点图,添加图例信息,可以进行缩放、移动,鼠标在曲线上时显示当前坐标点 QChart功能类 继承QGraphicsView 重写鼠标事件函数 protected:void resizeEvent(QResizeEvent *event);void mouseMoveEvent(QMouseEvent *event);void mousePressEvent(QMouseEv…

C++共同体

共同体是一种数据格式&#xff0c;他能储存不同的数据类型&#xff0c;但是同一时间只能储存其中的一种类型。 语法&#xff1a; union 共同体名 { 成员一的数据类型 成员名一&#xff1b; 成员二的数据类型 成员名二&#xff1b; 成员n的数据类型 成员名n&#xff1b; }

PHP养老院管理系统-计算机设计毕业源码-00115

摘要 随着社会老龄化进程的加速&#xff0c;养老院管理系统在提高养老服务质量和效率方面发挥着越来越重要的作用。本研究旨在设计和实现一个基于PHP的养老院管理系统&#xff0c;以满足养老院的日常管理需求&#xff0c;提升养老服务水平。 本研究首先对养老院管理系统的需求进…

大模型系列——幻觉

在kimi中输入提示词&#xff0c;得到本文脉络&#xff1a; 我想写大模型幻觉技术文章&#xff0c;请对以下标题进行补全和细化&#xff1a; 1、幻觉原因 2、幻觉消除方案 3、幻觉检测方案 4、幻觉评估数据集 背景 研究人员将大模型的幻觉分为事实性幻觉&#xff08;Factuali…