【微信开发】微信小程序实现实时聊天功能

这篇具有很好参考价值的文章主要介绍了【微信开发】微信小程序实现实时聊天功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近在做一个项目,需要运用到实时聊天功能,分享一下。

【微信开发】微信小程序实现实时聊天功能    【微信开发】微信小程序实现实时聊天功能

分为:

1.界面如何布局以及细节;

2.如何实现实时更新;

3.全部代码展示;

        一、界面如何布局以及细节:

        1.说到底,聊天界面就是循环一个数组,每一行为一个单位(item),循环(wx.for)我们设置的装聊天记录的数组。

【微信开发】微信小程序实现实时聊天功能

        2.我们设置每个item中有一个“id”来区别当前这条消息是本人发的,还是对方发的。(在连接系统后可以用两方人的_id来区分)。

        数组设置为:

                 【微信开发】微信小程序实现实时聊天功能

        3.我们在很多的带有聊天功能的系统中都知道,进入页面和发送信息我们的需要将视角放置到我们刚更新的那条信息,则就有

        ①设置<scroll-view>中的一个叫scroll-into-view的属性为一个“toBottom”这个字段:

<scroll-view class="sv" scroll-y scroll-into-view="{{toBottom}}">
</scroll-view>

        ②在循环体中加上id="item{{index}}",意为:设置当前循环体的id为当前item对应下标;

        ③我们在js中初始化聊天内容时每次都设置toBottom为当前循环的长度减一:

this.setData({
    toBottom : `item${this.data.chatContent.length - 1}`,
})

注意:每一次为toBottom赋值时,应当与周围的this.setData({})分开,否者会赋值失败!

        二、如何实现实时更新:

        首先,我们需要知道微信开发中有一个数据库监听函数:

        实时数据推送 | 微信开放文档微信开发者平台文档https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database/realtime.html

        大概就是说我们在程序中写上了这个,我们就可以在运行时实时监听数据库执行了哪些操作(当然不是所有)。你可以拿去实现一下它的实例代码,看看打印,感受一下。

        三、全部代码展示:

        1.wxml:

<view class="root">
	<scroll-view class="sv" scroll-y scroll-into-view="{{toBottom}}">

		<view class="box" wx:for="{{content}}" id="item{{index}}">
			<view class="item" wx:if="{{item.id == 1}}">
				<image src="{{mineAvatorSrc}}" class="mineAvatorSrc"></image>
				<view class="mineTextBox">
					<text class="mineText">{{item.text}}</text>
				</view>
			</view>

			<view class="item" wx:if="{{item.id == 0}}">
				<view class="himTextBox">
					<text class="himText">{{item.text}}</text>
				</view>
				<image src="{{himAvatorSrc}}" class="himAvatorSrc"></image>
			</view>
		</view>

	</scroll-view>

	<view class="sendBar">
		<input type="text" model:value="{{mess}}" class="input"/>
		<view class="button" bindtap="sendMess">
			<text class="buttonText">发送</text>
		</view>
	</view>
</view>

        2.wxss:

.root {
	width: 100%;
	height: 100vh;
	display: flex;
	flex-direction: column;
	align-items: center;
}

.sv {
	background-color: white;
	width: 80%;
	height: 90vh;
}

.sendBar {
	width: 80%;
	height: 10vh;
	display: flex;
	flex-direction: row;
	align-items: center;
	justify-content: center;
	border: 2px solid #1E90FF;
}

.input {
	background-color: white;
	border: 2px solid #1E90FF;
}

.box {
	width: 100%;
	display: flex;
	flex-direction: row;
	margin-top: 2px;
	margin-bottom: 2px;
}

.item {
	background-color: white;
	width: 100%;
	min-height: 50px;
	display: flex;
	flex-direction: row;
	align-items: center;
}

.mineText {
	font-size: 12px;
	color: white;
}

.himText {
	font-size: 12px;
	color: white;
}

.adText {
	position: absolute;
	margin: auto;
	right: 20px;
}

.button {
	background-color: #1E90FF;
	width: 60px;
	height: 30px;
	display: flex;
	flex-direction: row;
	align-items: center;
	justify-content: center;
	margin-left: 20rpx;
}

.buttonText {
	font-size: 14px;
	color: white;
}

.mineAvatorSrc {
	height: 45px;
	width: 45px;
  position: relative;
  margin-left: 20rpx;
}

.himAvatorSrc {
	height: 45px;
	width: 45px;
	position: relative;
	right: 20rpx;
}

.mineTextBox {
	background-color: #1E90FF;
	max-width: 50%;
	border-radius: 15rpx;
	padding-left: 5px;
	padding-right: 5px;
	padding-top: 5px;
	padding-bottom: 5px;
	margin: auto;
	margin-left: 40rpx;
	display: block;
	text-overflow:ellipsis;
	word-wrap:break-word;
}

.himTextBox {
	background-color: #1E90FF;
	max-width: 50%;
	border-radius: 15rpx;
	padding-left: 5px;
	padding-right: 5px;
	padding-top: 5px;
	padding-bottom: 5px;
	margin: auto;
	margin-right: 40rpx;
	display: block;
	text-overflow:ellipsis;
	word-wrap:break-word;
}

        3.js:

const app = getApp()
const db = wx.cloud.database()
 
Page({
 
  /**
   * 页面的初始数据
   */
  data: {
    mess : '',
    content : [],//聊天信息
    mineAvatorSrc : '/images/user_male.jpg',
    himAvatorSrc : '/images/user_female.jpg',
	},
	
    //获取格式化的时间 yyyy-mm-dd-hh:mm-ss
	getFormatTime(){
		let date = new Date();
		let ymd = date.toISOString().substring(0,10);//年-月-日
		let hms = date.toTimeString().substring(0,8);//小时-分钟-秒钟
		console.log(ymd + "-" + hms);
		return ymd + "-" + hms;//拼接
	},

  //“发送”
  sendMess(){
    let that = this;
    let mess = that.data.mess;
	let content = that.data.content;
	let date = that.getFormatTime();
	let id = that.data.currentId;
    wx.showLoading({
      title: '发送ing...',
      mask: true,
      success: (res) => {},
      fail: (res) => {},
      complete: (res) => {
        db.collection('chatTest')
        .doc(id)
        .update({
          data : {
            chatContent : content.concat({
              id : 0,//用户自己发送,为0
			  text : mess,
			  date : date
            })
          },
          success:function(res){
            console.log("添加成功!",res);
          },
          fail:function(err){
            console.log("添加失败!",err);
          },
          complete:function(){
            that.setData({
              mess : '',
            })
            wx.hideLoading({
              noConflict: true,
              success: (res) => {},
              fail: (res) => {},
              complete: (res) => {},
            })
          }
        })
      },
    })
  },

  //初始化数据库的字段
  initChatContent(){
	  let that = this;
	wx.showLoading({
	  title: '初始化数据库的字段中...',
	  mask: true,
	  success: (res) => {},
	  fail: (res) => {},
	  complete: (res) => {
		  db.collection('chatTest')
		  .add({
			  data : {
				  chatContent : [],//设置一个空的聊天循环体
			  },
			  success(res){
				console.log("初始化成功!",res);
				that.setData({
					currentId : res._id//设置当前的id
				})
			  },
			  fail(err){
				console.log("初始化失败!",err);
			  },
			  complete(){
				wx.hideLoading({
				  noConflict: true,
				  success: (res) => {},
				  fail: (res) => {},
				  complete: (res) => {},
				})
			  }
		  })
	  },
	})
  },

  //查询聊天
  queryChat(){
    let that = this;
    wx.showLoading({
      title: '查询...',
      mask: true,
      success: (res) => {},
      fail: (res) => {},
      complete: (res) => {
        db.collection('chatTest')
        //.doc('4efa204964219ab20003873513331ef9')
        .get({
          success:function(res){
            console.log("查询成功!",res);
            if(res.data.length == 0){
				that.initChatContent();//初始化数据库字段
			}
			else{
				that.setData({
					currentId : res.data[0]._id,//设置当前的id
					content : res.data[0].chatContent//赋值给当前的聊天循环体
				})
				
				//定位到最后一行
				that.setData({
					toBottom : `item${that.data.content.length - 1}`,
				})
			}
          },
          fail:function(err){
            console.log("查询失败!",err);
          },
          complete:function(){
            wx.hideLoading({
              noConflict: true,
              success: (res) => {},
              fail: (res) => {},
              complete: (res) => {},
            })
          }
        })
      },
    })
  },
  
  //数据库的监听器
  dbWatcher(){
	let that = this;
    db.collection('chatTest').where({
    })
    .watch({
      onChange: function (res) {
        //监控数据发生变化时触发
		console.log("res:",res);
		if(res.docChanges != null){
			if(res.docChanges[0].dataType == "update"){//数据库监听到的内容
				let length = res.docChanges[0].doc.chatContent.length;
				console.log("length : ",length);
				let value = res.docChanges[0].doc.chatContent[length - 1];//要增添的内容
				console.log("value : ",value);
				that.setData({
					content : that.data.content.concat(value)
				})
				//定位到最后一行
				that.setData({
					toBottom : `item${that.data.content.length - 1}`,
				})
			}
		}
      },
      onError:(err) => {
        console.error(err)
      }
    })
  },

  //获取时间并格式化时间
  checkDateAndTime(){
    let date = new Date();
    let ymd = date.toISOString().substring(0,10);//年-月-日
    let time = date.toTimeString().substring(0,8);//时:分:秒

    console.log("年-月-日 : ",ymd);
    console.log("时:分:秒 : ",time);

    let resDate = ymd + '-' + time;
    console.log("resDate : ",resDate);
},

 
  /**
   * 生命周期函数--监听页面加载
   */
    // 生命周期函数--监听页面加载
  onLoad: function (options) {

	this.dbWatcher();

	this.queryChat();

  },

  onReady(){

  },
 
})

现在是单人聊天,实现后你可以将wxml中的

        wx:if="{{item.id == 1}}"和wx:if="{{item.id == 0}}"

还有

        sendMess()中的id : 0 

改一改,然后预览一下,就可以实现电脑和手机实时聊天了!

(写完的闲聊:第一次写博客,还请大家指点。)文章来源地址https://www.toymoban.com/news/detail-443920.html

到了这里,关于【微信开发】微信小程序实现实时聊天功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序WebSocket实现stream流式聊天对话功能

    要在微信小程序实现聊天对话功能,回话是流式应答,这里使用了WebSocket技术。WebSocket大家应该都很熟悉,使用wx.connectSocket就可以了。这里可能需要注意下的是流式应答,后端如何发送,前端如何接收。直接上代码: 可以扫码体验: 后端关键代码: 小程序ts代码: 可以扫码

    2024年04月10日
    浏览(68)
  • thinkphp websocket 开发实时聊天系统的用户群组与订阅功能实现 (一)

    PHP开发实时聊天系统的用户群组与订阅功能实现 在当今社交互联网时代,实时聊天系统已经成为人们日常交流的重要工具。为了提供更好的用户体验,我们需要实现用户群组与订阅功能,使得用户能够方便地创建和加入群组,并且能够订阅感兴趣的内容。 本篇文章将介绍如

    2024年02月07日
    浏览(33)
  • 微信小程序原生开发功能合集十五:个人主页功能实现

      本章个人主页功能实现,展示当前登录用户信息、个人主页、修改密码、浏览记录、我的收藏、常见问题、意见反馈、关于我们等界面及对应功能实现。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实

    2024年02月06日
    浏览(75)
  • 微信小程序原生开发功能合集十六:系统主页实现

      本章实现小程序主页开发及对应逻辑处理,实现问卷填报相关功能,实现问卷查看、问卷查看、填报历史等功能的实现。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下:   

    2024年02月10日
    浏览(32)
  • 微信小程序实现简单的点击切换功能(微信开发者工具)

    📚文章目录 🔗首先创建一个简单的切换按钮📋 如图下  📋wxml代码  📋wxss代码 🔗但是这个元素是无法点击的,所以要添加一个点击事件到这两个元素里面  📋js代码(在page({})里面添加) 📋wxml代码  🔗class使用三元表达式来继续点击判断  🔗使用bindtap绑定事件  事件的

    2024年02月09日
    浏览(79)
  • 如何为微信小程序添加客服和在线聊天功能

    微信小程序作为一种轻量级的应用程序,已经成为了很多企业和个人的选择。在实现业务转化的过程中,与用户的互动交流是非常重要的一环,因此为小程序添加客服和在线聊天功能也是非常必要和关键的。本文将详细介绍如何为微信小程序添加客服和在线聊天功能。 一、添

    2024年02月04日
    浏览(56)
  • 微信小程序原生开发功能合集十二:编辑界面的实现

      本章实现编辑界面的实现处理,包括各编辑组件的使用及添加数据保存数据流程的实现处理。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下:    1. CSDN课程: https://edu.csdn.ne

    2024年02月02日
    浏览(38)
  • springboot使用 WxJava 实现 微信小程序(uniapp开发)的登陆功能

    前端使用uniapp来开发微信小程序 后端springboot中使用WxJava来做服务端( WxJava是微信服务端开发 的Java SDK ) 该图来源于微信小程序官方文档 根据uniapp的官网直接通过它提供的第三方 登陆api直接使用,代码如下 直接根据WxJava的官方demo (1) yml配置 (2)两个配置文件 (3)contro

    2024年02月15日
    浏览(34)
  • 使用云开发环境的云函数实现微信小程序的支付功能

    背景: 近期在开发一个商城类的微信小程序,因为本人只会使用 C 语言对 nodejs 环境不熟悉,因此在开发微信小程序时选用容易上手的云开发环境开发微信小程序。我想选用云开发环境的小伙伴和我的想法一致,对微信小程序开发相关知识了解很少。我的小程序的主体是个体

    2024年04月23日
    浏览(31)
  • 微信小程序使用uni-app开发小程序及部分功能实现详解心得

    目录 一、uni-app 1、简介 2、开发工具 3、新建 uni-app项目 4、把项目运行到微信开发者工具 二、实现tabBar效果 1、创建tabBar页面 2、配置tabBar 1、创建分包目录 2、在 pages.json 文件中配置 3、创建分包页面 四、公用方法封装 五、搜索功能 1、搜索组件 2、搜索建议实现 3、本地存储

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包