阅读 56

Next.js+React聊天室|Next仿微信桌面端|next.js聊天实例

一、项目介绍

next-webchat 基于Next.js+React.js+Redux+Antd+RScroll+RLayer等技术构建的PC桌面端仿微信聊天项目。实现了消息/表情发送、图片/视频预览、拖拽/粘贴图片发送、红包/朋友圈等功能。

二、技术实现

  • 技术框架:next.js+react.js+redux+react-redux
  • UI组件库:Antd (蚂蚁金服pc端react组件库)
  • 字体图标:阿里iconfont图标库
  • 弹窗组件:RLayer(基于react.js封装自定义弹窗)
  • 虚拟滚动:RScroll(基于react.js自定义美化滚动条)

◆ Next.js简述

next.js是一个基于react.js构建的服务器端SSR框架,star高达59K+。让你的网页拥有SEO功能。

◆ 目录结构

◆ next.js/react自定义弹窗组件

项目中没有使用Antd的Dialog弹框,而是自己造了一个react.js桌面端弹窗组件RLayer。

如果感兴趣的话,可以看看下面这篇分享文章。

◆ next.js/react自定义虚拟滚动条组件

如下图:项目中的滚动条均是自己开发的PC端美化滚动条组件RScroll。

Rscroll支持原生滚动条、是否自动隐藏、滚动条尺寸/层级/颜色等功能。

◆ next公共布局

next.js自定义公共模板,管理页面入口。新建layouts/index.js页面。

function Layout(props) {
    const router = useRouter()

    // 拦截验证
    useEffect(() => {
        // ...
    }, [])

    return (
    <>
        {/* 配置公共head信息 */}
        
            Next.js聊天室
            
            
            
        

        
{/* 右上角按钮 */} {/* 侧边栏 */} {/* 中间栏 */} {/* 主体布局 */}
{props.children}
) }

Head组件可以配置一些页面SEO信息,如:标题title、关键词keyword、描述description及图标icon等信息。

◆ next聊天模块

 

聊天编辑框单独分离出了一个editor.js组件,在react中实现div可编辑器contenteditable属性处理聊天输入、表情、光标处插入内容、粘贴截图等功能。

// react中实现div的contenteditable属性
return (
    <div 
        ref={editorRef}
        className="editor"
        contentEditable="true"
        dangerouslySetInnerHTML={{__html: state.editorText}}
        onClick={handleClicked}
        onInput={handleInput}
        onFocus={handleFocus}
        onBlur={handleBlur}
        style={{userSelect: ‘text‘, WebkitUserSelect: ‘text‘}}>
    
)

基于RLayer弹窗实现的视频播放功能。

handlePlayVideo = (item, e) => {
    rlayer({
        content: (
            
视频预览
{/* 视频video */}
), layerStyle: {background: ‘#f6f5ef‘}, opacity: .2, area: [‘550px‘, ‘450px‘], drag: ‘.ntDrag__head‘, resize: true, maximize: true, }) }

编辑框支持拖拽发送图片功能。通过onDragEnter、onDragOver、onDrop事件处理拖拽。

handleDragEnter = (e) => {
    e.stopPropagation()
    e.preventDefault()
}
handleDragOver = (e) => {
    e.stopPropagation()
    e.preventDefault()
}
handleDrop = (e) => {
    e.stopPropagation()
    e.preventDefault()
    console.log(e.dataTransfer)

    this.handleFileList(e.dataTransfer)
}
// 获取拖拽文件列表
handleFileList = (filelist) => {
    let files = filelist.files
    if(files.length >= 2) {
        rlayer.message({icon: ‘error‘, content: ‘暂时支持拖拽一张图片‘})
        return false
    }
    for(let i = 0; i < files.length; i++) {
        if(files[i].type != ‘‘) {
            this.handleFileAdd(files[i])
        }else {
            rlayer.message({icon: ‘error‘, content: ‘目前不支持文件夹拖拽功能‘})
        }
    }
}
handleFileAdd = (file) => {
    if(file.type.indexOf(‘image‘) == -1) {
        rlayer.message({icon: ‘error‘, content: ‘目前不支持非图片拖拽功能‘})
    }else {
        let reader = new FileReader()
        reader.readAsDataURL(file)
        reader.onload = function() {
            let img = this.result

            console.log(img)
        }
    }
}

好了,基于next.js+react实现pc端聊天就分享到这里了。希望大家能喜欢哈~~ ????

最后附上一个Taro、Nuxt.js+Vue聊天项目

 

原文:https://www.cnblogs.com/xiaoyan2017/p/14195483.html

文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐