封装一个丝滑的聊天框组件

news2024/11/30 0:32:25

需求背景

应公司业务要求,需要做个聊天机器人,要适应不同的业务场景,大概就跟淘宝客服类似,发送消息,机器人自动回复。

话不多说,直接开撸

技术栈: react(hooks写法) + flex布局

功能点梳理

  • 配置信息接收(机器人名称,超时自动回复,人工回复等待超时等等)
  • 发送消息
  • 接收接口返回的消息(包括图片)
  • 输入框鼠标拖动伸缩
  • 下拉获取历史聊天记录
  • 聊天消息过多时的滚动条处理

页面结构如下图

在这里插入图片描述

所用技术细节

1、下拉获取历史聊天记录:react-pull-to-refresh
	使用react-pull-to-refresh这个插件,在消息展示框外围套上该插件,使用方式如下
	它跟翻页是一个原理,只不过要处理一下数组的展示顺序,这个很简单。

在这里插入图片描述

2、 把接口请求放进props中,如下:
	大部分都是接口传递,因为需要多个地方的机器人使用,所以这样处理

图1

3、发送消息的逻辑处理

这里没有写滚动条的处理逻辑,手写一下: 用ref绑定滚动条,发送消息or拉取历史记录,需要计算滚动条滚动的高度并作出对应处理
在这里插入图片描述

4、 flex布局,比较基础,这里就掠过,主要是消息展示框自适应
5、 伸缩input, 给input上方放一个div占位,设置onmousedown,监听onmousemove来设置input的高度

这里我加了一个额外的组件处理,直接看代码吧,比较直观

import React, { useState } from 'react';
import { useSelector } from 'react-redux';

import './index.scss';

export default function ResizeWrapper(props) {
  const [mouseIsDown, setMouseIsDown] = useState(false); // 标识鼠标是否被按下
  // 获取侧边栏的打开状态
  const { sidebarOpenning } = useSelector((state) => state.sidebarState);
  const { child } = props; // content为聊天框组件
  const [contentWidth, setContentWidth] = useState(600); // 内容区域宽度

  document.onmousemove = function (e) {
    if (!mouseIsDown) return;

    let w;
    // 用鼠标点击的clientX 减去侧边栏的宽度还有额外的padding or margin 得到想要的宽度
    if (sidebarOpenning) {
      w = e.clientX - 180 - 12;
    } else {
      w = e.clientX - 60 - 12;
    }
    if (w < 420 || w > 800) {
      console.log(contentWidth);
      return;
    }
    setContentWidth(w);
  };
  document.onmouseup = function () {
    setMouseIsDown(false);
  };
  const handleMouseDown = (e) => {
    setMouseIsDown(true);
    console.log('down', e.clientX);
  };

  return (
    <>
      <div className="resize-container" style={{ width: contentWidth + 'px' }}>
        {child}
      </div>
      <div className="resize-bar" onMouseDown={handleMouseDown}></div>
    </>
  );
}


效果如下:
请添加图片描述

最终效果如下:https://live.csdn.net/v/262594

ok,完美收关!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python——列表的常用操作

1.append&#xff1a; cities [北京] cities.append(上海) 2.count&#xff1a;统计某个元素在泪飙中出现的次数 temps [to,be,or,not,to,be] print(temps.count(to)) 3.extend&#xff1a;将一个列表中元素追加到另外一个列表中 a [1,2,3] b [4,5,6] c a.extend(b) 4.ins…

GPU上运行基于bert的分类任务训练loss为nan

问题如下&#xff1a; 运行环境&#xff1a;GPU 1080Ti 代码流程&#xff1a;因为是在之前的一份情感数据集上测试通过的&#xff0c;所以流程整体上应该没有大的问题。 但就是loss一直为nan&#xff0c;也没有报错。 然后经对比测试&#xff0c;同样的数据&#xff0c;同样…

Java——红黑树

概念 红黑树也是一种二叉搜索树&#xff0c;但是和avl树不同&#xff0c;它并不是依靠平衡因子来保证树的平衡的&#xff0c;而是通过颜色 红黑树每个节点中会存储颜色&#xff0c;分为红色和黑色&#xff0c;通过红黑树的限制条件&#xff0c;可以保证从根节点出发到叶子节点…

Final、求职两头难,留学生如何摆脱焦虑?

2022不知不觉已临近尾声&#xff0c;期末在即&#xff0c;今年秋招也即将告一段落。很多同学在学业和求职两难中艰难挣扎&#xff0c;焦虑情绪无形中被无限放大… 你是不是也有这样的感受—看着周围的同学们&#xff0c;一个接一个的拿着offer发到了朋友圈里&#xff0c;而自己…

推荐系统学习笔记-论文研读--点击率预估中特征交互的作用

研究背景 当前点击率预估模型没有完全挖掘特征交互的潜力特征的表征学习与特征的交互存在冲突笛卡尔积的方法比当前的点击率预估模型效果都好算法模型的效率和效果的平衡阿里巴巴线上业务量级和耗时的考虑 当前模型的特征交互的相关方法 论文研究成果 这篇论文的主要贡献 强…

day20【代码随想录】二叉树的前序遍历、二叉树的中序遍历、二叉树的后序遍历

文章目录前言一、二叉树的前序遍历&#xff08;力扣144&#xff09;1、递归遍历2、非递归遍历二、二叉树的中序遍历&#xff08;力扣94&#xff09;1、递归遍历2、非递归遍历三、二叉树的后序遍历&#xff08;力扣145&#xff09;1、递归遍历2、非递归遍历总结前言 1、二叉树的…

十一、JavaScript——字符串

一、转义字符 字符串 在 JS中使用单引号或者双引号来表示字符串&#xff08;要么全用双引号&#xff0c;要么全用单引号&#xff0c;不要混着用&#xff09; 转义字符 反斜杠 \ 使用typeof检查转义字符返回的是string类型 在 JS中使用单引号或者双引号来表示…

零成本实现接口自动化测试 – Java+TestNG 测试Restful service

接口自动化测试 – JavaTestNG 测试 Restful Web Service 关键词&#xff1a;基于Rest的Web服务&#xff0c;接口自动化测试&#xff0c;数据驱动测试&#xff0c;测试Restful Web Service&#xff0c; 数据分离&#xff0c;JavaMavenTestNG 本文主要介绍如何用Java针对Restf…

【Lilishop商城】No3-9.模块详细设计,订单模块-3(售后)的详细设计

仅涉及后端&#xff0c;全部目录看顶部专栏&#xff0c;代码、文档、接口路径在&#xff1a; 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇会结合业务介绍重点设计逻辑&#xff0c;其中重点包括接口类、业务类&#xff0c;具体的结合源代…

Seata-TCC快速上手

原文链接 如果是小白&#xff0c;可以先看TCC步骤&#xff0c;核心思想&#xff0c;然后使用Seata&#xff0c;阅读Seata官方提供的示例代码&#xff0c;验证自己的猜想&#xff0c;再看遍TCC。 分布式事务是跨过多个数据库或者系统的事务&#xff0c;在电商、金融领域应用十…

[附源码]Node.js计算机毕业设计房屋租赁管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

web前端Javascript学习之了解JavaScript弹出框

在JavaScript中&#xff0c;可以创建对话框或弹出窗口来与用户进行交互。 JavaScript具有三种不同类型的弹出框&#xff1a;警告框&#xff0c;确认框和提示框。 一、警告框 警告框是最简单的弹出框。它使可以向用户显示一条短消息。还包括“确定”按钮&#xff0c;用户必须…

巧用Github Action 自动推送docker镜像,白piao github服务器资源,还省时又省力

对于个人开发者来说如果不想再自己电脑上搭建CI/DI系统&#xff08;毕竟吃资源&#xff09;&#xff0c;Github Action是一个不二的选择。 本文我们来通过 Github Action 实现 SpringBoot 项目的自动编译、制作doceker镜像&#xff0c;最后推送到docker hub 仓库。 Github Acti…

亿华通通过上市聆讯:第三季营收降53% 净亏3457万

雷递网 雷建平 12月13日北京亿华通科技股份有限公司&#xff08;简称&#xff1a;“亿华通”&#xff09;日前通过聆讯&#xff0c;准备在香港上市。这之前&#xff0c;亿华通是2020年8月在科创板上市&#xff0c;发行价为76.65元&#xff0c;发行17,630,523股&#xff0c;募集…

技术分享 | 测试平台开发-前端开发之Vue.js 框架(一)

Vue.js 是一套用于构建用户界面的渐进式框架&#xff0c;在目前的前端开放中比较流行的前端框架。 Vue 被设计成自底向上的逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或已有项目整合。但是学习 Vue.js 需要一定的 HTML、CSS、和…

09、SpringBoot中集成SSM及其他插件

1、创建spring Boot项目导入如下基础依赖 <!-- 打包方式 jar 包 --> <packaging>jar</packaging><!-- 指定父工程 --> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</art…

[附源码]Node.js计算机毕业设计房屋中介管理信息系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

[附源码]Python计算机毕业设计SSM基于web的图书借阅管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

常规设置Apache服务器实例

常规设置Apache服务器实例 1&#xff0e;设置文档根目录和首页文件的实例 【例1】默认情况下&#xff0c;网站的文档根目录保存在/var/www/html中&#xff0c;如果想把保存网站文档的根目录修改为/home/wwwroot&#xff0c;并且将首页文件修改为myweb.html&#xff0c;那么该如…

CPU一级缓存L1 D-cache\L1 I-cache与二级缓存L2 cache深度分析

CPU缓存&#xff1a;通过优化的的读取机制&#xff0c;可以使CPU读取缓存的命中率非常高&#xff08;大多数CPU可达90%左右&#xff09;&#xff0c; 也就是说CPU下一次要读取的数据90%都在缓存(SRAM)中&#xff1b; 只有大约10%需要从内存&#xff08;DRAM、DDR等&#xff0…