为了账号安全,请及时绑定邮箱和手机立即绑定

基于vue3+vant3.x聊天实战|vue3.0仿微信聊天模板|vue3实例开发

2021年随着尤大相继推出的vue3.x和vite2构建工具的稳定版,让vue.js再一次成为开发者热捧的前端框架。支持国产的崛起!👏

项目简述

基于vue3全家桶技术vue3.x+vuex4+vue-router4 及 vant3+v3popup 构架开发的仿微信mobile端界面聊天实例[Vue3Chat项目]。
图片描述

vue3-chat 实现图文消息、图片/视频预览、网址查看、红包/朋友圈等功能。
图片描述

技术栈

  • 框架技术:vscode编码 + vue3.x/vue-router@4+vuex4
  • 组件库:vant3.x (有赞移动端 vue3.0 组件库)
  • 弹框组件:v3-popup (基于 vue3 弹层组件)
  • 字体图标:阿里 iconfont 字体图标库
  • 自定义顶部 Navbar+底部 Tabbar

图片描述

项目目录结构

图片描述

整个项目均是采用vue3.x全新语法编写开发。

图片描述

图片描述

图片描述

图片描述

图片描述

图片描述

图片描述

图片描述

图片描述

图片描述

图片描述

图片描述

图片描述

图片描述

图片描述

图片描述

项目整体布局分为顶部导航+内容区+底部tab标签栏。

vue3自定义topbar+tab标签栏


vue3实现全局弹框组件

项目中使用到的弹出框功能,是使用vue3.x自定义组件实现。
图片描述
V3Popup 基于vue3.x实现的移动端弹出框组件,集合msg、alert、dialog、actionSheet、toast等多种效果。支持**20+**种自定义参数配置。

项目配置文件

vue.config.js对项目进行一些基础配置,可以配置一些路径alias别名。

/**
 * Vue3基础配置文件
 */

const path = require('path')

module.exports = {
    // 基本路径
    // publicPath: '/',

    // 输出文件目录
    // outputDir: 'dist',

    // assetsDir: '',

    // 环境配置
    devServer: {
        // host: 'localhost',
        // port: 8080,
        // 是否开启https
        https: false,
        // 编译完是否打开网页
        open: false,
        
        // 代理配置
        // proxy: {
        //     '^/api': {
        //         target: '<url>',
        //         ws: true,
        //         changeOrigin: true
        //     },
        //     '^/foo': {
        //         target: '<other_url>'
        //     }
        // }
    },

    // webpack配置
    chainWebpack: config => {
        // 配置路径别名
        config.resolve.alias
            .set('@', path.join(__dirname, 'src'))
            .set('@assets', path.join(__dirname, 'src/assets'))
            .set('@components', path.join(__dirname, 'src/components'))
            .set('@views', path.join(__dirname, 'src/views'))
    }
}

vue3引入公共组件

在main.js中引入一些路由、vuex配置,公共组件及样式。

import { createApp } from 'vue'
import App from './App.vue'

// 引入vuex和地址路由
import store from './store'
import router from './router'

// 引入js
import '@assets/js/fontSize'

// 引入公共组件
import Plugins from './plugins'

const app = createApp(App)

app.use(store)
app.use(router)
app.use(Plugins)

app.mount('#app')

vue3实现表单验证

vue3语法实现表单登录验证功能。

<script>
import { reactive, inject, getCurrentInstance } from 'vue'
export default {
    components: {},
    setup() {
        const { ctx } = getCurrentInstance()

        const v3popup = inject('v3popup')
        const utils = inject('utils')
        const formObj = reactive({})

        // ...

        const handleSubmit = () => {
            if(!formObj.tel){
                Snackbar('手机号不能为空!')
            }else if(!utils.checkTel(formObj.tel)){
                Snackbar('手机号格式不正确!')
            }else if(!formObj.pwd){
                Snackbar('密码不能为空!')
            }else{
                ctx.$store.commit('SET_TOKEN', utils.setToken());
                ctx.$store.commit('SET_USER', formObj.tel);

                // ...
            }
        }

        return {
            formObj,
            handleSubmit
        }
    }
}
</script>

大家可以看到在vue3的setup函数中不能使用this,转而使用getCurrentInstance替代了。

vue3实现朋友圈功能

通过在onMounted中监听scroll滚动事件来控制顶部导航的透明度。

<!-- //朋友圈模板 -->
<template>
    <div>
        <header-bar :bgcolor="headerBg" transparent zIndex="1010">
            <template #backIco><i class="iconfont icon-arrL"></i></template>
            <template v-slot:right><div @click="isShowPublish=true"><i class="iconfont icon-tianjia"></i></div></template>
        </header-bar>

        <div class="vui__scrollview flex1" ref="scrollview">
            ...
        </div>
    </div>
</template>

<script>
import { onMounted, onBeforeUnmount, ref, reactive, toRefs, inject } from 'vue'
import { ImagePreview } from 'vant'

export default {
    components: {},
    setup() {
        const scrollview = ref(null)

        const data = reactive({
            headerBg: 'transparent',
            // ...
        })

        onMounted(() => {
            scrollview.value.addEventListener('scroll', handleScroll)
        })

        onBeforeUnmount(() => {
            scrollview.value.removeEventListener('scroll', handleScroll)
        })

        // 页面滚动处理
        const handleScroll = (e) => {
            if(e.target.scrollTop > 160) {
                data.headerBg = 'linear-gradient(to right, #00d2ee, #00e077)'
            }else {
                data.headerBg = 'transparent';
            }
        }

        // ...

        return {
            ...toRefs(data),
            scrollview,
            
            // ...
        }
    }
}
</script>

ok,基于vue3.x+vuex+vant3开发聊天界面实例就先分享到这里。
后续还会分享一些vue3实战案例项目。敬请关注!!
图片描述

ending,如果你觉得这篇文章还不错,你还可以:

  • 转发+点赞,让更多的人也能看到你的分享。
  • 加关注,不定期分享原创技术知识。
  • 顺便也可以去看看其它历史文章。
点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Web前端工程师
手记
粉丝
28
获赞与收藏
92

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消