使用APICloud AVM多端框架开发仿微信通讯录功能

简介: 本项目基于APICloud AVM框架编写,因此思路要转变下比如标签的用法、CSS样式表的写法、项目的目录结构、dom的操作等都不一样了,完全是Vue、React的编程思维。

 

一、效果展示

1.jpg


二、项目结构图

2.jpg


三、数据结构图

1、服务端的原始好友数据结构

3.jpg

2、按字母分类排序后的好友数据结构

4.jpg

3、字母导航数据结构

5.jpg


四、功能实现的思路

本项目基于APICloud AVM框架编写,因此思路要转变下比如标签的用法、CSS样式表的写法、项目的目录结构、dom的操作等都不一样了,完全是Vue、React的编程思维。


微信通讯录功能是将所有联系人根据字母首字拼音排序分类,单击右边字母滑动到相应字母分组编。本项目的核心功能是对数据按首字母进行排序,页面布局可以按照微信的布局进行设计,由于涉及到页面滚动以及、滚动到指定位置,因此我们可以选用scroll-view组件。


本项目的页面布局结构图如下

6.jpg


注意scroll-view组建必须设置高度否者不能正常显示,高度计算公式如下:高度=页面窗口高度--状态栏高度--顶部导航高度--自定义tab-bar高度


代码如下

let top = 0;
if (api.safeArea) {
  top = api.safeArea.top;
} else {
  let res = wx.getSystemInfoSync();
  top = res.statusBarHeight;
}
this.list_h = api.winHeight - top - 44 - 53;

image.gifimage.gif

nav-bar和tab-bar是自定义的所以知道它的高度分别是44和53px

scroll-view 组件完整属性如下

<scroll-view id="list" :show-scrollbar='false' :bounces='true' style={'height:'+list_h+'px'}>

image.gif

接下来讲解核心功能好友数据结构的转换,从服务端拿到的好友数据一般是没有按字母排序和分类的格式如下

[{
    "id": "1",
    "nick_name": "杨洋",
    "avatar": "../../res/avatar/tx7.jpg"
 }, 
 {
    "id": "2",
    "nick_name": "666",
    "avatar": "../../res/avatar/tx8.jpg"
}]

image.gifimage.gif

转换后的数据格式如下

[{
  "letter": "A",
  "hasData": true,
  "users": [{
  "name": "abc1209",
  "unicode": 97,
  "avatar": "../../res/avatar/tx14.jpg",
  "id": "14"
  }]
}, {
   "letter": "B",
   "hasData": false,
   "users": []
  }, {
   "letter": "#",
   "hasData": true,
   "users": [{
   "name": "17115719973",
   "unicode": 49,
   "avatar": "../../res/avatar/tx1.jpg",
   "id": "1"
   }]
}]

image.gifimage.gif

转换的原理就是提取nick_name字段第一个字符串获取拼音字母以及unicode码然后分组排序需要参照pinyin码表,网上可以下载,我这里重新封装了一下。

7.jpg

定义变量

8.jpg

用到的方法如下

init() {
    this.initName();
    this.NameIndex();
},
initName() {
    const letterArr = this.data.letter;
    for (let index = 0; index < letterArr.length; index++) {
        this.data.handleData.push({
            letter: letterArr[index].letter,
            hasData: false,
            users: []
        });
    }
},
NameIndex() {
    const that = this;
    for (let i = 0; i < that.data.list.length; i++) {
        const NameLetter = that.getLetter(that.data.list[i].nick_name).firstletter;
        const unicode = that.getLetter(that.data.list[i].nick_name).unicode;
        const index = that.indexPosition(NameLetter);
        if (that.data.nameIndex.indexOf(NameLetter) == -1) {
            that.data.handleData[index].hasData = true;
            that.data.nameIndex.push(NameLetter);
        }
        that.data.handleData[index].users.push({
            name: that.data.list[i].nick_name,
            unicode: unicode,
            avatar: that.data.list[i].avatar,
            id: that.data.list[i].id
        });
        that.paixu()//同一字母内排序
    }
},
indexPosition(letter) {
    if (!letter) { return ''; }
    const ACode = 65;
    return letter === '#' ? 26 : letter.charCodeAt(0) - ACode;
},
getLetter(str) {
    return this.getFirstLetter(str[0]);
},
getFirstLetter(str) {
    if (!str || /^ +$/g.test(str)) {
        return '';
    }
    const result = [];
    const unicode = str.charCodeAt(0);
    let ch = str.charAt(0);
    if (unicode >= 19968 && unicode <= 40869) {
        ch = this.data.firstletter.charAt(unicode - 19968);
    } else if ((unicode >= 97 && unicode <= 122) || (unicode >= 65 && unicode <= 90)) {
        ch = ch.toLocaleUpperCase();
    } else {
        ch = '#';
    }
    const obj = {
        unicode: unicode,
        firstletter: ch
    };
    return obj;
},
paixu() {
    for (let index = 0; index < this.handleData.length; index++) {
        if (this.handleData[index].hasData) {
            let userArr = this.handleData[index].users;
            userArr = userArr.sort((a, b) => {
                let value1 = a.unicode;
                let value2 = b.unicode;
                return value1 - value2;
            });
        }
    }
},

image.gifimage.gif

代码执行顺序

9.jpg

转换后handleData的数据格式如下

10.jpg

最后就是单击字母滚动到指定区域,这里用scroll-view组建的scrollTo方法

$('#list').scrollTo({ 'view': letter })。


这里还要判断当前字母是否在nameIndex数组里面,如果存在就滚动到指定区域,同时字母单击后会添加绿色背景,所以这里需要改变当前字母的active值为true

好友列表布局(每个字母类别设置一个id, scrollTo方法根据id滚动到指定区域)

<view :id="rs.letter == '#' ? 'other' : rs.letter" v-for="(rs,index) in handleData" 
    :key="index" v-show="rs.hasData">
    <view class="list-item-title">
        <text class="letter">{rs.letter}</text>
    </view>
    <view class="list-item" v-for="(u, uIndex) in rs.users" :key="uIndex" @click="user(u)">
    <view class="list-item-left">
         <view class="img">
                <image class="avatar" :src="u.avatar"></image>
         </view>
    </view>
    <view class="list-item-right">
         <text class="name">{u.name}</text>
    </view>
    </view>
</view>

image.gif

字母列表布局

<view @click="letterClick(rs.letter,i)" v-for="(rs,i) in letter" :key="i">
    <text class="list-right-letter active" v-if="rs.active">{rs.letter}</text>
    <text class="list-right-letter" v-else>{rs.letter}</text>
</view>

image.gif

单击方法

letterClick(letter, key) {
    this.data.letter = []//字母数组
    this.data.letter = base.letter()
    this.data.letter[key].active = true
    for (var i = 0; i < this.data.nameIndex.length; i++) {
        if (letter == this.data.nameIndex[i]) {
            if (letter == '#') {
                $('#list').scrollTo({ 'view': 'other' })
            } else {
                $('#list').scrollTo({ 'view': letter })
            }
        }
    }
},

image.gif

目录
相关文章
|
22天前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
328 7
|
21天前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
402 1
|
22天前
|
存储 自然语言处理 小程序
微信小程序多语言切换神器:简繁体切换功能完全指南
随着全球化的发展,支持多种语言的应用程序愈发重要。本文介绍了如何在微信小程序中实现简体与繁体字体之间的切换功能,以满足不同地区用户的需求。通过创建utils文件夹并编写相应的转换函数,开发者可以方便地实现语言切换,从而提升用户体验。文章中还附带了示例代码和效果图,帮助读者更好地理解和应用这一功能。
65 0
微信小程序多语言切换神器:简繁体切换功能完全指南
|
25天前
|
缓存 小程序 索引
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
133 1
|
30天前
|
小程序 前端开发 数据安全/隐私保护
微信小程序全栈开发中的身份认证与授权机制
【10月更文挑战第3天】随着移动互联网的发展,微信小程序凭借便捷的用户体验和强大的社交传播能力,成为企业拓展业务的新渠道。本文探讨了小程序全栈开发中的身份认证与授权机制,包括手机号码验证、微信登录、第三方登录及角色权限控制等方法,并强调了安全性、用户体验和合规性的重要性,帮助开发者更好地理解和应用这一关键技术。
46 5
|
30天前
|
小程序 前端开发 JavaScript
微信小程序全栈开发中的PWA技术应用
【10月更文挑战第3天】微信小程序作为新兴应用形态,凭借便捷体验与社交传播能力,成为企业拓展业务的新渠道。本文探讨了微信小程序全栈开发中的PWA技术应用,包括离线访问、后台运行、桌面图标及原生体验等方面,助力开发者提升小程序性能与用户体验。PWA技术在不同平台的兼容性、性能优化及用户体验是实践中需注意的关键点。
50 5
|
26天前
|
小程序 JavaScript API
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
这篇文章介绍了如何在uni-app和微信小程序中实现将图片保存到用户手机相册的功能。
415 0
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
|
16天前
|
存储 小程序 安全
微信的开发管理都需要配置什么?
【10月更文挑战第17天】微信的开发管理都需要配置什么?
26 0
|
21天前
|
JavaScript 小程序 开发者
uni-app开发实战:利用Vue混入(mixin)实现微信小程序全局分享功能,一键发送给朋友、分享到朋友圈、复制链接
uni-app开发实战:利用Vue混入(mixin)实现微信小程序全局分享功能,一键发送给朋友、分享到朋友圈、复制链接
230 0
|
25天前
|
小程序
uni-app开发微信小程序使用onPullDownRefresh(下拉刷新)总结
uni-app开发微信小程序使用onPullDownRefresh(下拉刷新)总结
351 0