共计 3277 个字符,预计需要花费 9 分钟才能阅读完成。
项目简介
基于 uni-app+vue+vuex+uniPop+swiper 等技术开发的仿微信聊天室 uniapp-chatroom 项目,类似 vue 及小程序 api 语法使开发更加方便,实现了发送图文消息、表情 (gif 动图),图片预览、地图位置、红包、仿微信朋友圈等功能
效果图
在 H5 / 小程序 / App 端测试效果如下 ( 后续大图统一展示 App 端 )
技术实现
- 编辑器:HBuilder X
- 技术框架:uni-app + vue
- 状态管理:Vuex
- iconfont 图标:阿里字体图标库
- 自定义导航栏 + 底部 Tabbar
- 弹窗组件:uniPop(基于 uni-app 封装模态弹窗)
- 测试环境:H5 端 + 小程序 + App 端(三端均兼容)
- 高德地图:vue-amap
引入公共组件及样式
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()
uniapp+vuex 实现登录拦截
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>
uniapp 实现朋友圈功能
如何实现微信朋友圈页面向下滚动,顶部导航栏由透明变背景色,通过 onPageScroll 函数实现自定义导航上下滑动自动调整导航栏的透明度
/**
* @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 滚动至聊天页面底部
在 uni-app 将聊天信息滚动到底部有些不好实现,可以借助 scroll-view 组件 scroll-into-view 属性,不过只能设置一次,不能动态设置。
只能通过动态改变 scroll-top 来实现
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 开发聊天室的介绍就到这里,后续继续为大家分享实战项目,希望多多支持。????????
项目中用到的自定义弹窗、自定义导航栏可参看下面链接。
uni-app 自定义 Modal 弹窗组件 | 仿 ios、微信弹窗效果
uni-app 自定义导航栏按钮 |uniapp 仿微信顶部导航条
正文完