主要使用小程序云开发的watch 监听集合中符合查询条件的数据的更新事件,支持 where
, orderBy
, limit
,不支持 field。
一、云开发数据表设计
一个是用户表user :用户头像(avatarUrl)、昵称(nickName)等用户基本信息,可在授权登录时获取并保存到user表中。
一个是对话表存储message:发送者(from)、接受者(to)、消息(message数组)
消息利用云开发的push 之前添加到message数组中。
信息收发使用watch 根据from to查询监听消息改变
二、页面代码
chat.js
const app = getApp()
const { db, user } = app
const User = db.collection('user')
const Message = db.collection('message')
const _ = db.command
Page({/**
* 页面的初始数据
*/
data: {
InputBottom: 0,
user,
to: '', // 发送给谁
toInfo: {}, //接受者信息
queueWatch: '',// 消息监听
content: '', // 发送内容
message: [], // 聊天信息
scrollLast: null,
},/**
* 生命周期函数--监听页面加载
*/
onLoad({ to }) {
this.setData({ to })
this.getToInfo()
},/**
* 获取接受者信息
*/
getToInfo() {
const { to } = this.data
const that = this
User.doc(to).get({
success: ({ data }) => {
that.setData({ toInfo: data })
wx.setNavigationBarTitle({
title: '好友:' + data.nickName,
})
}
})
},/**
* 生命周期函数--监听页面显示
*/
onShow() {
const { to, user } = this.data
this.handleCreate(to, user._id)
this.handleWatch(true)
},
//消息自动到底部
getScollBottom() {
this.setData({ scrollLast: 'lastPosition' })
},
//创建聊天
handleCreate(to, from, cb) {
Message.where({ to, from }).get({
success: ({ data }) => {
if (data.length == 0) {
Message.add({
data: { to, from, message: [] },
success: () => {
(typeof cb == 'function') && cb()
}
})
} else (typeof cb == 'function') && cb()
}
})
},
//添加信息
handleAddMessage(to, from, message, cb) {
Message.where({ to, from }).update({
data: { message: _.push(message) },
success: ({ data }) => {
(typeof cb == 'function') && cb()
}
})
},
// 信息发送
handleSend() {
const { to, user, content } = this.data
if (!content) return
const from = user._id
const message = { from, content }
const that = this
this.handleAddMessage(to, from, message, () => {
console.log('添加成功')
//接受者创建对话和添加信息
that.handleCreate(from, to, () => {
that.handleAddMessage(from, to, message, () => {
that.setData({ content: '' })
})
})
})
},
/**
* 监听值改变
*/
handleInput(e) {
const { name, value } = app.dataset(e)
const obj = {}
obj[name] = value
this.setData(obj)
},
InputFocus({ detail: { height } }) {
this.setData({ InputBottom: height })
},
InputBlur(e) {
this.setData({ InputBottom: 0 })
},/**
* 监听消息变化
*/
handleWatch: async function (watch) {
let { queueWatch, to, user } = this.data
const that = this
if (watch && !queueWatch) { // 监听
queueWatch = Message.where({ to, from: user._id })
.watch({// 发起监听
onChange: function ({ docs }) {
const { message = [] } = docs[0] || {}
that.setData({ message })
that.getScollBottom()
},
onError: function (err) {
console.error('the watch closed because of error', err)
}
})
this.setData({ queueWatch })
} else if (!watch && queueWatch) { // 取消监听
await queueWatch.close()
this.setData({ queueWatch: '' })
}
},
/**
* 生命周期函数--监听页面卸载
*/
onHide: function () {
this.handleWatch(false) // 取消监听
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {},/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {},/**
* 用户点击右上角分享
*/
onShareAppMessage() {}
})
chat.wxml
{{item.content}}
2018年3月23日 13:23
{{item.content}}
13:23
页面样式使用的是colorui css
三、效果
文章图片
【小程序|微信小程序云开发实现聊天(聊天室,一对一聊天)】
推荐阅读
- 微信小程序|微信小程序基础知识点
- 微信小程序|微信小程序视图层
- 微信小程序|【你踩的坑这里都有】微信小程序分包指南
- 微信小程序|uniapp微信小程序subPackages分包处理
- github|微信小程序开源到github并更新的步骤
- h5网页跳转微信小程序的方法,wx-open-launch-weapp按钮不显示
- 软希网源码资源下载|星宿UI V2.1 开源wordpress资源下载小程序源码,流量主激励视频广告
- 微信小程序|【微信小程序】三分钟学会小程序的列表渲染