uni-app聊天室|vue+uniapp仿微信聊天实例|uniapp仿微信App界面

vue

一、介绍

运用UniApp+Vue+Vuex+swiper+uniPop等技术开发的仿微信原生App聊天室|仿微信聊天界面实例项目uniapp-chatroom,实现了发送图文消息、表情(gif图),图片预览、地图位置、长按菜单、红包/钱包、仿微信朋友圈等功能。

二、测试效果

H5 + 小程序 + App端测试效果如下,实测多端效果均为一致。(后续大图统一展示App端)

二、技术选型

  • 编辑器:HBuilder X
  • 技术框架:uni-app + vue
  • 状态管理:Vuex
  • iconfont图标:阿里字体图标库
  • 自定义导航栏 + 底部Tabbar
  • 弹窗组件:uniPop(基于uni-app封装模态弹窗)
  • 测试环境:H5端 + 小程序 + App端(三端均兼容)
  • 高德地图:vue-amap

◆ 顶部导航栏headerBar

顶部导航栏采用的是自定义模式,具体可参看这篇文章:uni-app自定义导航栏按钮|uniapp仿微信顶部导航条

在pages.json里面配置globalStyle,将navigationStyle设为custom时,原生顶部导航栏不显示,这时就能自定义导航栏

 "globalStyle": {"navigationStyle": "custom"} 

◆ 引入公共样式/组件及全局弹窗

import Vue from \'vue\'

import App from \'./App\'

// >>>引入css

import \'./assets/fonts/iconfont.css\'

import \'./assets/css/reset.css\'

import \'./assets/css/layout.css\'

// >>>引入状态管理

import store from \'./store\'

Vue.prototype.$store = store

// >>>引入公共组件

import headerBar from \'./components/header/header.vue\'

import tabBar from \'./components/tabbar/tabbar.vue\'

import popupWindow from \'./components/popupWindow.vue\'

Vue.component(\'header-bar\', headerBar)

Vue.component(\'tab-bar\', tabBar)

Vue.component(\'popup-window\', popupWindow)

// >>>引入uniPop弹窗组件

import uniPop from \'./components/uniPop/uniPop.vue\'

Vue.component(\'uni-pop\', uniPop)

Vue.config.productionTip = false

App.mpType = \'app\'

const app = new Vue({

...App

})

app.$mount()

◆ Vuex + uniapp登录验证

import Vue from \'vue\'

import Vuex from \'vuex\'

Vue.use(Vuex)

export default new Vuex.Store({

state: {

user: uni.getStorageSync(\'user\'),

token: uni.getStorageSync(\'token\'),

},

mutations: {

// 存储token

SET_TOKEN(state, data) {

state.token = data

uni.setStorageSync(\'token\', data)

},

// 存储用户名

SET_USER(state, data) {

state.user = data

uni.setStorageSync(\'user\', data)

},

...

},

})

<script>

import { mapState, mapMutations } from \'vuex\'

import util from \'../../utils/util.js\'

export default {

data() {

return {

formObj: {},

}

},

computed: {

...mapState([\'user\', \'token\'])

},

mounted() {

// 判断是否有登录

if(this.user){

uni.redirectTo({url: \'/pages/index/index\'})

}

},

methods: {

// 提交表单

handleSubmit(e) {

...

}

}

}

</script>

◆ 仿微信朋友圈透明导航栏

通过onPageScroll函数实现自定义导航上下滑动自动调整导航栏的透明度,滑动到距离顶部200 效果如下图二

  

/**

* @tpl 朋友圈模板

*/

<template>

<view class="flexbox flex_col">

<header-bar :isBack="true" title="朋友圈" :bgColor="{background: headerBarBackground}" transparent>

<text slot="back" class="uni_btnIco iconfont icon-arrL"></text>

<text slot="iconfont" class="uni_btnIco iconfont icon-publish mr_5" @tap="handlePublish"></text>

</header-bar>

<view class="uni__scrollview flex1">

<view class="uni-friendZone">

...

</view>

</view>

</view>

</template>

<script>

export default {

data() {

return {

headerBarBackground: \'transparent\'

}

},

onPageScroll : function(e) {

// console.log("滚动距离为:" + e.scrollTop);

this.headerBarBackground = \'rgba(65,168,99,\'+e.scrollTop / 200+\')\'

},

methods: {

...

}

}

</script>

<style scoped>

</style>

◆ uniapp实现聊天页面滚动至底部

在h5端将聊天页面滚动到底部很好实现,小程序中通过设置scroll-view属性scroll-into-view的值也能实现,可是在uni-app里面怎么将聊天信息滚动至底部呢?

uni-app通过判断聊天内容高度和scroll-view高度的大小设置滚动距离

<scroll-view id="scrollview" scroll-y="true" :scroll-top="scrollTop" style="height: 100%;">

<view class="uni-chatMsgCnt" id="msglistview">

<view class="msgitem">xxx</view>

<view class="msgitem">xxx</view>

<view class="msgitem">xxx</view>

...

</view>

</scroll-view>

export default {

data() {

return {

scrollTop: 0,

...

}

},

mounted() {

this.scrollToBottom()

},

updated() {

this.scrollToBottom()

},

methods: {

// 滚动至聊天底部

scrollToBottom(t) {

let that = this

let query = uni.createSelectorQuery()

query.select(\'#scrollview\').boundingClientRect()

query.select(\'#msglistview\').boundingClientRect()

query.exec((res) => {

// console.log(res)

if(res[1].height > res[0].height){

that.scrollTop = res[1].height - res[0].height

}

})

},

...

}

}

◆ uniapp聊天代码片段

<script>

const emotionJson = require(\'./mock-emotion.js\')

const messageJson = require(\'./mock-chat.js\')

export default {

data() {

return {

scrollTop: 0,

showFootToolbar: false,

showEmotionChoose: false,

editorText: \'\',

editorLastCursor: null,

// 表情json

emotionList: emotionJson,

// 消息记录

messageList: messageJson,

// 预览图片临时数组

previewImgArray: [],

}

},

mounted() {

this.scrollToBottom()

},

updated() {

this.scrollToBottom()

},

methods: {

// 滚动至聊天底部

scrollToBottom(t) {

let that = this

let query = uni.createSelectorQuery()

query.select(\'#scrollview\').boundingClientRect()

query.select(\'#msglistview\').boundingClientRect()

query.exec((res) => {

// console.log(res)

if(res[1].height > res[0].height){

that.scrollTop = res[1].height - res[0].height

}

})

},

// 点击聊天消息区域

msgPanelTaped() {

if(!this.showFootToolbar) return

this.showFootToolbar = false

},

// 表情、选择区切换

swtEmotionChooseView(bool) {

this.showFootToolbar = true

this.showEmotionChoose = bool

},

...

// 点击表情

handleEmotionTaped(emoj) {

if(emoj == \'del\') return

// 在光标处插入表情

let startStr = this.editorText.substr(0, this.editorLastCursor)

let endStr = this.editorText.substr(this.editorLastCursor)

this.editorText = startStr + `${emoj}` + endStr

},

// >>> 【选择区功能模块】------------------------------------------

// 选择图片

handleLaunchImage() {

let that = this

let msglist = this.messageList

let len = msglist.length

// 消息队列

let data = {

id: `msg${++len}`,

msgtype: 5,

isme: true,

avator: \'/static/uimg/u__chat_img1.jpg\',

author: \'King\',

msg: \'\',

imgsrc: \'\',

videosrc: \'\'

}

uni.chooseImage({

count: 1,

sourceType: [\'album\'],

success: function(res){

// console.log(res)

// console.log(res.tempFilePaths)

data.imgsrc = res.tempFilePaths.toString()

msglist = msglist.concat(data)

that.messageList = msglist

}

})

},

...

// 位置

handleChooseLocation() {

let that = this

let msglist = this.messageList

let len = msglist.length

// 消息队列

let data = {

id: `msg${++len}`,

msgtype: 8,

isme: true,

avator: \'/static/uimg/u__chat_img1.jpg\',

author: \'King\',

msg: \'\',

imgsrc: \'\',

videosrc: \'\'

}

uni.chooseLocation({

success: (res) => {

console.log(res)

// 插入消息

data.msg = {

name: res.name,

address: res.address,

latitude: res.latitude,

longitude: res.longitude

}

msglist = msglist.concat(data)

that.messageList = msglist

}

})

},

}

}

</script>

以上就是基于uniapp开发仿微信聊天室的介绍,希望大家能喜欢

以上是 uni-app聊天室|vue+uniapp仿微信聊天实例|uniapp仿微信App界面 的全部内容, 来源链接: utcz.com/z/375077.html

回到顶部