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

需求背景

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

话不多说,直接开撸

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

功能点梳理

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

页面结构如下图

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

; 所用技术细节

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

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

封装一个丝滑的聊天框组件
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>

    </>
  );
}

效果如下:

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

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

ok,完美收关!

Original: https://blog.csdn.net/jacoby_fire/article/details/128301592
Author: jacoby_fire
Title: 封装一个丝滑的聊天框组件

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/747111/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 计算标准差,numpy.std和torch.std的区别

    文章目录 输入: 课本中的标准差计算公式: Numpy中的std计算: Torch中的std计算: 总结: 输入: [1.0000, -1.0000, 3.0000] 课本中的标准…

    Python 2023年8月23日
    058
  • 运用领域模型——DDD

    模型被用来描述人们所关注的现实或想法的某个方面。模型是一种简化。它是对现实的解释 —— 把与解决问题密切相关的方面抽象出来,而忽略无关的细节。 每个软件程序是为了执行用户的某项活动…

    Python 2023年10月13日
    047
  • pandas数据分析之分组聚合

    在数据分析过程中,经常会需要根据某一列或多列把数据划分为不同的组别,然后再对其进行数据分析。本文将介绍pandas的数据分组及分组后的应用如对数据进行聚合、转换和过滤。在关系型数据…

    Python 2023年8月6日
    041
  • Python爬虫深造篇(四)——Scrapy爬虫框架启动一个真正的项目

    一、前情提要 经过前面的学习,我们初识了 Scrapy 框架,通过 Scrapy 提供的互动工具,我们在命令行中体验了 Scrapy 中的 CSS 选择器 最重要的几个点是:. 代…

    Python 2023年10月1日
    044
  • 【python语言学习】

    Python学习 仅仅记录python语言基础知识的学习过程 python学习目录 1、python的下载与安装 2、pip安装以及简单使用 3、wheel文件安装 4、pip换源…

    Python 2023年9月18日
    034
  • 关于PyCharm无法安装库的解决办法

    目录 前言 方法一:拆了东墙补西墙 方法二:釜底抽薪 总结 前言 在命令行中使用pip(简称小p)安装第三方库是非常常用的方法,但是我电脑的小p最近出了点问题。 事情要从我在PyC…

    Python 2023年8月23日
    044
  • 3GPP中URLLC标准研究进展

    【摘 要】为了应对未来移动流量与设备连接数量的爆炸式增长,第五代通信系统(5G)将通信服务从人与人之间通信渗透到物联网及各种垂直行业领域,3GPP从NR第一个版本开始就开展了针对低…

    Python 2023年10月8日
    039
  • Django Ninja简单教程

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

    Python 2023年8月4日
    042
  • scrapy基础(中间件)

    中间件/管道的使用都先要在setting里启动代理操作必须使用中间件才能实现: process_exception(): request.meta[‘proxy’] = ‘http…

    Python 2023年10月7日
    040
  • linux scrapy 定时任务_scrapy 定时执行的两种方法

    –– coding: utf-8 –– import subprocess, schedule, time, datetime, l…

    Python 2023年10月5日
    033
  • Python Flask框架(3)

    HTTP状态码 当访问一个网站时,浏览人的浏览器会向网站发送请求,浏览器接收并显示网页前,网页服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器…

    Python 2023年8月15日
    063
  • Python爬虫常用正则re.findall的使用

    1、单字符表达 . : 除换行以外所有字符 [] :[aoe] [a-w] 匹配集合中任意一个字符 \d :数字 [0-9] \D : 非数字 \w :数字、字母、下划线、中文 \…

    Python 2023年8月3日
    032
  • 算法工程师老潘总结的一些经验

    算法工程师老潘总结的一些经验 前一段时间一直在优化部署模型。这几天终于来了需求,又要开始重操训练一些新模型了。趁着这次机会总结了下之前的一些训练模型的笔记,可能比较杂,抛砖引玉!当…

    Python 2023年10月29日
    050
  • python实现支付宝支付

    通过支付宝沙箱实现支付 &#x63D0;&#x793A;&#xFF1A;https://open.alipay.com/develop/sandbox/ap…

    Python 2023年8月9日
    036
  • Pandas入门

    Pandas入门 Pandas简介 Pandas 是 Python 语言的一个扩展程序库,用于数据分析。 Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据…

    Python 2023年8月8日
    049
  • Python3教程:Pandas模块删除数据的几种情况

    开始之前,pandas中DataFrame删除对象可能存在几种情况1、删除具体列2、删除具体行3、删除包含某些数值的行或者列4、删除包含某些字符、文字的行或者列本文就针对这四种情况…

    Python 2023年11月2日
    040
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球