

Next.js+React聊天室|Next仿微信桌面端|next.js聊天实例
source link: http://www.cnblogs.com/xiaoyan2017/p/14195483.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一、项目介绍
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 功能。
https://github.com/vercel/next.js
◆ 目录结构
◆ next.js/react自定义弹窗组件
项目中没有使用Antd的Dialog弹框,而是自己造了一个react.js桌面端弹窗组件RLayer。
如果感兴趣的话,可以看看下面这篇分享文章。
https://www.cnblogs.com/xiaoyan2017/p/14085142.html
◆ next.js/react自定义虚拟滚动条组件
如下图:项目中的滚动条均是自己开发的PC端美化滚动条组件RScroll。
Rscroll支持 原生滚动条、是否自动隐藏、滚动条尺寸/层级/颜色 等功能。
◆ next公共布局
next.js自定义公共模板,管理页面入口。新建layouts/index.js页面。
function Layout(props) { const router = useRouter() // 拦截验证 useEffect(() => { // ... }, []) return ( <> {/* 配置公共head信息 */} <Head> <title>Next.js聊天室</title> <link rel="icon" href="/favicon.ico" /> <meta name="keywords" content="Next.js|React.js|Next.js聊天室|Next.js仿微信|React聊天实例"></meta> <meta name="description" content="Next-WebChat 基于Next.js+React+Redux构建的服务端渲染聊天应用程序"></meta> </Head> <div className="next__container flexbox flex-alignc flex-justifyc"> <div className={utils.classNames('next__wrapper')} style={{ backgroundImage: `url(${props.skin})` }}> <div className="next__board flexbox"> {/* 右上角按钮 */} <WinBar {...props} /> {/* 侧边栏 */} <Sidebar {...props} /> {/* 中间栏 */} <Middle /> {/* 主体布局 */} <div className="nt__mainbox flex1 flexbox flex-col"> {props.children} </div> </div> </div> </div> </> ) }
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'}}> </div> )
基于RLayer弹窗实现的视频播放功能。
handlePlayVideo = (item, e) => { rlayer({ content: ( <div className="flexbox flex-col" style={{height: '100%'}}> <div className="ntDrag__head"><i className="iconfont icon-bofang"></i> 视频预览</div> <div className="ntMain__cont flex1 flexbox flex-col"> {/* 视频video */} <video className="vplayer" src={item.videosrc} poster={item.imgsrc} autoPlay preload="auto" controls x5-video-player-fullscreen="true" webkit-playsinline="true" x-webkit-airplay="true" playsInline x5-playsinline="true" style={{height: '100%', width: '100%', objectFit: 'contain', outline: 'none'}} /> </div> </div> ), 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端聊天就分享到这里了。希望大家能喜欢哈~~ :muscle::muscle:
最后附上一个Taro、Nuxt.js+Vue聊天项目
https://www.cnblogs.com/xiaoyan2017/p/13823195.html
https://www.cnblogs.com/xiaoyan2017/p/12039544.html
Recommend
-
50
原文链接: https://www.cnblogs.com/xiaoyan2017/p/9266179.html 运用html5开发的仿微信聊天室实战项目weChatRoom,基于h5+css3+zepto+weui+wcPop+swiper...
-
59
很早之前就有使用html5技术开发过一个web版仿微信、微博聊天,后来想着用vue技术开发一版,后面由于各种事情,一直没能落定。最近有些空闲就使用vue开发了一个vueWechat聊天室IM项目。 基于Vue2.5.6+Vuex+vue-router+vue
-
23
1、项目介绍 Flutter 是目前比较流行的跨平台开发技术,凭借其出色的性能获得很多前端技术爱好者的关注,比如 阿里闲鱼 , 美团 , 腾讯 等大公司都有投入相关案例生产...
-
4
基于uniapp + nvue实现的uniapp仿微信界面功能聊天应用 txim 实例项目,实现了以下功能。1: 聊天会话管理2: 好友列表3: 文字、语音、视频、表情、位置等聊天消息收发4: 一对一语音视频在线通话开...
-
3
uniapp+nvue实现仿微信App聊天应用 —— 成功实现好友聊天+语音视频通话功能发布于 11 月 2 日基于uniapp + nvue实现的uniapp仿微信App聊天应用 txim 实例项...
-
3
各位看官可能要失望了,都第二篇了居然还是一行代码都没看到,别急别急,记得磨刀不误砍柴工。因为我们用到了腾讯云的SDK,所以我们在开发之前第一步就是要把腾讯云的AppId搞定,搞定AppId之后,还得去搞定用户信息,要不咋玩登录,往哪发消息啊。所以我...
-
17
基于svelte3.x+svelteKit构建仿微信App聊天应用svelte-chatroom。 svelte-chatroom 基于svelte.js+svelteKit+mescroll.js+svelte-popup等技术搭建开发的仿微信app界面聊天项目。支持发送图文消息/gif动图、图片/视频预览、下...
-
7
基于tauri+vue3.js+vite3跨桌面端仿微信聊天实例TauriVue3Chat。 tauri-chat 运用最新tauri+vue3+vite3+element-plus+v3layer等技术跨桌面端仿微信|QQ聊天程序EXE。基本实现了发送图文混排消息、图片/视频/网址预览、拖拽聊天区发...
-
3
Electron-ChatGPT桌面端ChatGPT实例|electron25+vue3聊天AI模板EXE ...
-
8
基于uniapp+vite4+pinia跨多端实现chatgpt会话模板Uniapp-ChatGPT。 uni-chatgpt 使用uni-app+vite4+vue3+pinia+uview-plus等技术构建多端仿制ChatGPT手机端APP会话应用模板。支持编译到h5+小程序+APP端,支持渲染markdown语法及代...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK