Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >小程序开发仿微信界面 DEMO

小程序开发仿微信界面 DEMO

原创
作者头像
Gcaufy
修改于 2017-06-19 10:59:19
修改于 2017-06-19 10:59:19
19.8K70
代码可运行
举报
文章被收录于专栏:Gcaufy的专栏Gcaufy的专栏
运行总次数:0
代码可运行

前言

先看一个视频,这个视频并不是去演示如何使用微信,而是演示基于wepy开发的微信小程序demo。

点击观看视频 : 【wepy开发的微信小程序demo 】

demo中包含的功能有:

  • 仿微信界面
  • 联系人列表
  • 私聊与自动回复
  • 聊天记录本地存储与清除

源代码地址:https://github.com/wepyjs/wepy

wepy是什么?可以查看我的另外一篇文章:《打造小程序组件化开发框架》

下面就讲讲是如何一步一步基于wepy实现这个仿微信demo的。

一、需求分析

首先要确定好自已在DEMO中想要实现的功能,微信有四个tab:微信聊天,通讯录,发现,我。右上角的搜索,添加好友功能,以及发现里的朋友圈和各项菜单功能,这里主要想实现的就是聊天,还有通讯录好友功能。因为考虑到小程序真机体验时只允许请求安全域名,所以数据不打算使用后端接口返回,而是采用MOCK数据模拟后端接口返回。聊天记录储存于小程序提供的Storage中。这样就能完整的模拟聊天功能,而且下载下来的DEMO可以直接在真机上体验。

同时评估一些技术细节:

涉及的原生API

  • 登录相关API wx.login
  • 获取用户信息API wx.getUserInfo
  • Storage相关 wx.getStorage,wx.setStorage,wx.clearStorage

技术方案

  • 样式部分使用sass,wepy现阶段支持less,sass,本demo使用sass
  • 代码部分使用新特性async/await
  • 数据接口使用MOCK数据模拟接口返回

二、页面组件划分

按微信界面展示大致划分为两个页面,首页index,聊天页chat,以及若干组件,如下图:

首页index中包含一个tab组件和四个tab分别所对应的组件message,contact,discovery,me。而且各自还包含一些子组件,如contact组件中包含alpha字母列表组件,discovery和me组件中分别包含一些list菜单列表组件。其中list组件达到了很好的复用效果。

聊天页chat中包含一个聊天面板组件chatboard和输入框组件input。

根据划分的组件,大致可以得到开发的目录结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
src
    components
        alpha.wpy --- 联系人
        chatboard.wpy --- "聊天面板" 组件
        contact.wpy --- "联系人" 组件
        discovery.wpy --- "发现" 组件
        input.wpy --- 聊天页输入框组件
        list.wpy --- 菜单列表组件
        me.wpy --- "我" 组件
        message.wpy --- message 组件
        tab.wpy --- tab 组件
    pages
        chat.wpy --- 聊天页
        index.wpy --- 首页
    app.wpy --- 小程序入口

三、切图与重构

直接用手机截屏然后放到Photoshop中处理。小程序做不同机型的适配很方便,提供了一个rpx的单位,官方说明如下:

rpx(responsive pixel): 可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素。

我的手机截图尺寸是 720px × 1280px, 为了方便计算,直接将截图按比例调整为 750px × 1333px。那么此时的单位换算就是1px = 1rpx,也就是说一个图片在Photoshop中是 80px × 80px,那么就直接写width: 80rpx;height: 80rpx;。

整理出各图标大小以及各元素之间的宽高间距等,方便在sass中使用。如下图:

按照第二步划分的页面组件,对组件进行基本的填充。然后页面内容就十分简单了。

src/pages/index.wpy:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<style type="sass">
.body, .tab_item {
    height: 100%;
}
</style>
<template>
    <view class="body">
        <view class="tab_item tab_message">
            <component id="message"></component>
        </view>
        <view class="tab_item tab_contact">
            <component id="contact"></component>
        </view>
        <view class="tab_item tab_discovery">
            <component id="discovery"></component>
        </view>
        <view class="tab_item tab_me">
            <component id="me"></component>
        </view>
        <component id="tab"></component>
    </view>
</template>

src/pages/chat.wpy:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<style type="sass">
.body {
    height: 100%;
    background-color: #ededed;
}
</style>
<template>
    <view class="body">
         <component id="chartboard"></component>
         <component id="input"></component>
    </view>
</template>

接着完成基本的重构工作,如下图:

四、MOCK数据设计

通过需求分析得到只需要两份基础数据:

  • 联系人数据
  • 初始聊天记录数据

其对应的数据表结构如下:

因此我们可以使用js构建这两份数据表作为原始数据, 目录结构设计大致如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
src
    mocks  --- mock数据目录
        users  --- 用户头像目录
            xxxx.png  --- xxxx头像
        contact.js  --- 联系人mock数据
        history.js  --- 聊天记录mock数据

src/mock/contact.js 模拟联系人数据返回,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 所有联系人数据
let users = [
    {id: 'jimgreen', name: 'Jim Green'},
    {id: 'hanmeimei', name: '韩梅梅'}
];
users = users.sort((a, b) => a.id.charCodeAt(0) - b.id.charCodeAt(0));

let table = users.map((v) => {
return {
        name: v.name,
        id: v.id,
        icon: `/mocks/users/${v.id}.png`
    };
});
export default table

src/mock/history.js模拟初始聊天记录数据返回,代码如下 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default [
    {'to': 'jimgrenn', 'from': 'me', 'type': 'text', 'msg': 'My name is Jim Green, nice to meet you.', 'time': 1480338091374},
    {'to': 'me', 'from': 'jimgreen', 'type': 'text', 'msg': 'Nice to meet you too', 'time': 1480338091375},
];

五、接口API设计

因为使用MOCK数据的关系,我们可以同步吐出接口数据,但这里希望能更接近于AJAX访问的异步效果,所以所有接口均返回setTimeout处理的Promise对象。

整理出所需功能的所有数据请求如下:

  • 拉取聊天列表页的聊天列表(用户头像,用户名称,最后一条聊天信息)
  • 拉取聊天页面的聊天记录 (用户头像,自己头像,聊天记录)
  • 发送聊天信息
  • 拉取tab我下的个人头像以及用户昵称等信息

因为涉及到的数据接口并不多,所以单独放在src/common/api模块下。

代码结构大致如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import m_contacts from '../mocks/contact';
import m_history from '../mocks/history';

export default {

    // 拉取用户信息
    getUserInfo () {},

    // 拉取与某个用户的聊天历史记录
    getHistory (id) {},

    // 拉取首页聊天列表
    getMessageList () {},

    // 发送聊天信息
    sendMsg (to, msg, type = 'text') {}
}

六、逻辑代码开发

逻辑代码部分主要包括三部分:

  • 调用数据接口,返回数据,渲染视图
  • 组件内事件交互
  • 组件之间相互通信

在message组件中需要拉取聊天列表信息并且渲染,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
    <view class="message">
        <block wx:for="{{list}}" wx:for-index="index" wx:for-item="item">
            <view class="item" bindtap="select" data-wepy-params="{{item.id}}">
                <view class="header">
                    <image class="img" src="{{item.icon}}"></image>
                </view>
                <view class="content">
                    <view class="name">{{item.name}}</view>
                    <view class="lastmsg">{{item.lastmsg}}</view>
                </view>
            </view>
        </block>
    </view>
</template>
<script>
import wepy from 'wepy';
import api from '../common/api';

export default class Message extends wepy.component {

        data = {
            list: []
        };

        methods = {
            select (evt, id) {
                wx.navigateTo({url: 'chat?id=' + id});
            }
        };
        async loadMessage () {
            this.list = await api.getMessageList();
            this.$apply();
        }
    }
</script>

message组件中只有一个数据源list,通过自定义方法loadMessage调用api模块获取聊天列表信息进行渲染,因为是在自定义的异步方法中进行数据绑定,所以需要执行this.$apply()让视图渲染。

同时,组件响应页面的tap事件select,选中聊天之后跳转至chat页面。

在chat页面进行聊天之后,返回到index页面时,需要message页面再次调用接口数据,重新渲染聊天列表页,这就需要在index页面的onShow方法中去让message组件重新调用loadMessage方法。这里可以选用 wepy 提供的$boradcast方法或者$invoke方法,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// src/pages/index.wpy
onShow() {
    this.$invoke('message', 'loadMessage');
}

这样就完成了message组件的所有功能,进入页面渲染列表,点击消息进入聊天页面。

在index页面中加入状态currentTab来标记当前选中tab。并提供切换tab事件。

src/pages/index:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
    <view class="body">
        <view class="tab_item tab_message" hidden="{{currentTab != 0}}">
            <component id="message"></component>
        </view>
        <view class="tab_item tab_contact" hidden="{{currentTab != 1}}">
            <component id="contact"></component>
        </view>
        <view class="tab_item tab_discovery" hidden="{{currentTab != 2}}">
            <component id="discovery"></component>
        </view>
        <view class="tab_item tab_me" hidden="{{currentTab != 3}}">
            <component id="me"></component>
        </view>
        <component id="tab"></component>
    </view>
</template>

<script>
    //....
    changeTab (idx) {
        this.currentTab = +idx;
        this.$apply();
    }
</script>

然后在tab组件中的每个tab中添加bindtap="change" data-wepy-params="{{index}}"事件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script>
import wepy from 'wepy';

    export default class Tab extends wepy.component {
        data = {
            active: 0,
        };
        methods = {
            change (evt, idx) {
                this.active = +idx;
                this.$parent.changeTab(idx);
            }
        };
    }
</script>

在tab组件中,直接通过$parent去调用父组件的changeTab方法,来达到实现tab切换效果:

至此已完成大致雏形,更多代码还请参考提供源代码。

结束语

wepy让用户能以组件化思维开发小程序,加上一些新特性的引入让开发与维护变得更简单,但同时缺点又在于引入框架以及额外的polyfill,npm增加项目代码体积(压缩后170kb),在仅限1M代码体积的小程序中,代码容量时时刻刻又显得有些捉肘见襟了。希望小程序能早日能放宽限制。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
7 条评论
热度
最新
写demo最起码搞得能够跑通
写demo最起码搞得能够跑通
回复回复点赞举报
demo的文件格式都不对
demo的文件格式都不对
回复回复点赞举报
这个项目不开源吗?
这个项目不开源吗?
回复回复点赞举报
git,mark,mark
git,mark,mark
回复回复点赞举报
很厉害了,界面的设计分析也很详致
很厉害了,界面的设计分析也很详致
回复回复点赞举报
虽然有些bug,但已经很好的解决了入门的问题。谢谢。
虽然有些bug,但已经很好的解决了入门的问题。谢谢。
回复回复点赞举报
谢谢楼主的分享。
谢谢楼主的分享。
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
wepy框架入门
使用微信开发者工具新建项目,本地开发选择dist目录。 微信开发者工具 --> 项目 --> 关闭ES6转ES5。 本地项目根目录运行wepy build --watch,开启实时编译。
达达前端
2019/07/03
6860
wepy框架入门
微信小程序wepy框架入门教程-底部导航栏效果(五)
wepy是腾讯自己开发的框架,作用主要是提高开发者的开发效率,采用了类似使用了vue的代码书写风格,开发者可以熟练的上手小程序开发。
王小婷
2019/03/06
1.1K0
打造小程序组件化开发框架
Gcaufy
2017/05/09
6.8K3
打造小程序组件化开发框架
快速入门 WePY 小程序
WePY 是 腾讯 参考了Vue 等框架对原生小程序进行再次封装的框架,更贴近于 MVVM 架构模式, 并支持ES6/7的一些新特性。
王念博客
2019/07/25
2.1K1
微信小程序组件化开发框架WePY
compilers: compilers为1.3.1版本之后的功能,如果需要使用其它语法,请先配置compilers,然后再安装相应的compilers。目前支持wepy-compiler-less, wepy-compiler-postcss,wepy-compiler-sass、wepy-compiler-babel、wepy-compiler-pug,其他compiler持续开发中......
达达前端
2019/07/03
1.4K0
微信小程序组件化开发框架WePY
微信小程序WePY开发框架简介
微信小程序入门门槛低、开发周期短、代码编写灵活、传播速度快等优点让微信小程序迅速火爆,开发者纷纷涌入,任何语言开发者一旦多了,就会有新的框架出来,WePY就是一个优秀的微信小程序开发框架。它让微信小程序的开发更加简单,功能更加强大,并且也优化了文件结构,熟悉了WePY之后确实可以让微信小程序开发更上一层楼。
大公爵
2018/12/05
2.4K0
微信小程序WePY开发框架简介
初试小刀自我简历小程序
最近在做小程序,和域名更换,和新域名备案事情,甚是较忙,少写了文章,今天尝试写一篇小白总结小程序的常见问题,刚接触小程序不到2周,在业余时间尝试小刀小程序,在做这个简历之前,自己亲身搜索了个人简历的小程序,都体验过,大部分是参差不齐,我这个算是比较用心的制作了,搜索出来的简历小程序要不就是其他第三方支持自动生成的,或者是自己制作的,但是都是放置一个设计的图,比较简单,但是也不缺一些好的案例。
张炳
2019/08/05
1.1K0
小程序聊天室|聊天对话小程序|仿微信界面
基于微信小程序开发的聊天室实战案例。很早之前就有开发过一个h5版聊天室,最近又开发了个小程序版聊天室,功能效果非常接近微信聊天,实现了消息、表情发送,小程序表情解析,图片、视频上传预览,打赏、红包等功能。
andy2018
2019/01/30
14.3K3
小程序聊天室|聊天对话小程序|仿微信界面
打造“微信小程序”组件化开发框架
导语 Bugly 之前发了一篇关于微信小程序的开发经验分享,小伙伴们在公众账号后台问了很多关于小程序开发方面的问题,精神哥在查阅相关内容的时候,发现了龚澄同学自己写了一个小程序开发框架,真的怒赞,赶紧安利给大家。 同时,如果大家有关于小程序的相关问题,可以在评论区留言,我们整理一下,看看后续为大家出一篇关于大家开发的问题解答。 千万不要问小程序的入口在哪里,精神哥也不知道,哈哈哈 正文 作为第一批小程序内测用户,我很有幸见证了小程序的成长,小程序上手十分简单,容易理解。但同时,因为运行环境的原因导致小程
腾讯Bugly
2018/03/23
1.2K0
微信小程序初探【类微信UI聊天简单实现】
微信小程序最近很火,火到什么程度,只要你一打开微信,就是它的身影,几乎你用的各个APP都可以在微信中找到它的复制版,另外官方自带的跳一跳更是将它推到了空前至高的位置。对比公众号,就我的感觉来说,有以下区别: 公众号略显繁琐:我首先要关注才能看到内容,而小程序不用(个人对微信公众号研究不深,不对之处还望见谅) 小程序性能要好一些:虽然我不是很清楚小程序用什么实现,就体验来说确实更接近原生一点;但是微信公众号是用网页的形式来展示内容的,其中的兼容性和性能问题不用我说,各位luer就已经清楚了吧 小程序更易开发:
糊糊糊糊糊了
2018/05/09
5.4K1
微信小程序初探【类微信UI聊天简单实现】
微信小程序实现各种特效实例
写在前面 最近在负责一个微信小程序的前端以及前后端接口的对接的项目,整体上所有页面的布局我都已经搭建完成,里面有一些常用的特效,总结一下,希望对大家和我都能有所帮助 实例1:滚动tab选项卡 先看一下
okaychen
2018/01/05
4.1K3
微信小程序实现各种特效实例
2019-面向小白的微信小程序-视频教学-基础
微信小程序,简称小程序,英文名Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用
万少
2025/02/08
1810
2019-面向小白的微信小程序-视频教学-基础
5分钟入门 - 微信小程序开发
如果你还没有微信公众平台的账号,请先进入 微信公众平台 首页,点击 “立即注册” 按钮进行注册。注册的账号类型可以是订阅号、服务号、小程序以及企业微信,我们选择 “小程序” 即可。
用户6808043
2022/02/25
8470
微信小程序开发之选项卡(窗口顶部TabBar)页面切换
微信小程序开发中选项卡.在Android中选项卡一般用fragment,到了小程序这里瞬间懵逼了. 总算做出来了.分享出来看看. 先看效果:
李维亮
2021/07/09
1.3K0
微信小程序入门文档下载_小程序开发教程全集免费
最新一版的微信开发者工具,把微信公众号的调试开发工作也集成了进去,可以更换开发模式。
全栈程序员站长
2022/09/20
10.7K0
微信小程序入门文档下载_小程序开发教程全集免费
小程序升级WePY2踩坑记
最近有个小程序项目需要迭代,但是迭代任务不多,时间比较充裕。而这个小程序最早是在18年的时候开发的,用的开发框架是 WePY 的 1.7.2 版本,去年也就是 19 年的时候 WePY 框架进行了升级,到了 2.0 版本。升级之后的 WePY,用 WePY 官方文档的话来说:通过优化细节,引入 Promise、Async Functions 等让开发小程序项目变得更加简单,高效。基于这些背景,我和小伙伴一拍即合,决定对我们的项目进行框架升级,体验下到底 WePY2 能给我们带来什么。
用户4456933
2021/06/01
2.3K0
微信小程序+php实现即时通讯聊天功能
Github:https://github.com/swoole/swoole-src/tags
黄啊码
2022/05/10
2K0
微信小程序+php实现即时通讯聊天功能
小程序模板语法样式与页面配置
在 data 中定义数据,在 WXML 中使用数据。使用Mustache{{}}语法:
timerring
2023/06/09
6460
小程序模板语法样式与页面配置
近两万字小程序攻略发布了
直接复用现有系统的登录体系,只需要在小程序端设计用户名,密码/验证码输入页面,便可以简便的实现登录,只需要保持良好的用户体验即可。
全栈程序员站长
2022/06/29
1.2K0
打造“微信小程序”组件化开发框架
作者:龚澄--腾讯前端工程师 @IMWeb前端社区 导语 作为第一批小程序内测用户,我很有幸见证了小程序的成长,小程序上手十分简单,容易理解。但同时,因为运行环境的原因导致小程序无法使用市面上的流行框架。小程序本身提供一此特性如:模块化,模板,数据绑定等,能极大的方便了使用惯MVVM框架的用户。 在几个月的开发历程里,我一直希望能有一套方案更大可能的让小程序开发更贴近于当下开发习惯,因此才会有wepy。通过wepy开发的代码经过编译后,能生成一份完美运行在小程序端的代码,而且wepy的目的就是让小程序开发
用户1097444
2022/06/29
7620
打造“微信小程序”组件化开发框架
推荐阅读
相关推荐
wepy框架入门
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验