小程序组件之仿微信通讯录的实现代码


Posted in Javascript onSeptember 12, 2018

最近模仿微信通信录做了个小程序组件,分享给大家,具体如下:

效果图

小程序组件之仿微信通讯录的实现代码

因为是使用的手机录屏,视频格式为MP4,上传到文章时发现只支持图片,还好电脑自动录屏功能,所以简单的录制了一下,完后又提示只能4M,只能再去压缩图片,所以画质略渣,各位客官讲究的看看吧。

特色功能介绍

  1. 用户只需按照格式传入参数,组件能够自动将参数按首字母分组,简单方便;
  2. 组件右侧首字母导航无需另外传值,并且根据参数具体有哪些首字母显示(没有的咱就不要);
  3. 用户进行上下滑动时,左右相互联动;
  4. 点击右侧导航,组件会相应的上下滚动。

 实现基础

本组件只使用了小程序基础组件中的scroll-view,不用那么麻烦,简单方便,一看就懂,哈哈哈

wxml

滚动区域

<scroll-view scroll-y style="height:100%;white-space:nowrap;" scroll-into-view="{{toView}}" enable-back-to-top bindscroll="scroll" scroll-with-animation scroll-top="{{scrollTop}}">
 <view class="list-group" wx:for="{{logs}}" wx:for-item="group">
  <view class="title" id="{{group.title}}">{{group.title}}</view>
  <block wx:for="{{group.items}}" wx:for-item="user">
   <view id="" class="list-group-item">
    <image class="icon" src="{{user.avatar}}" lazy-load="true"></image>
    <text class="log-item">{{user.name}}</text>
   </view>
  </block>
 </view>
</scroll-view>

简单说一下上述代码:根据小程序文档,在使用**scroll-view**组件用于竖向滚动时一定要设置高度,你们可以看到我在代码中设置了'height:100%;'这就实现了组件的滚动高度是整个页面。 但是请注意:很多同学会发现设置了高度100%后,组件并没有效果,这是因为你没有将页面高度设置为100%,所以你还需在app.wxss中设置page的高度为100%; 其他的属性看文档就好,我就不再多说;

2.侧面字母导航

<view class="list-shortcut">
 <block wx:for="{{logs}}">
  <text class="{{currentIndex===index?'current':''}}" data-id="{{item.title}}" bindtap='scrollToview'>{{item.title}}</text>
 </block>
</view>

3.固定在顶部的字母导航

<view class="list-fixed {{fixedTitle=='' ? 'hide':''}}" style="transform:translate3d(0,{{fixedTop}}px,0);">
  <view class="fixed-title">
   {{fixedTitle}}
  </view>
</view>

js

渲染参数

normalizeSinger(list) {
  //列表渲染
  let map = {
   hot: {
    title: this.data.HOT_NAME,
    items: []
   }
  }
  list.forEach((item, index) => {
   if (index < this.data.HOT_SINGER_LEN) {
    map.hot.items.push({
     name: item.Fsinger_name,
     avatar:this.constructor(item.Fsinger_mid)
     })
   }
   const key = item.Findex
   if (!map[key]) {
    map[key] = {
     title: key,
     items: []
    }
   }
   map[key].items.push({
    name: item.Fsinger_name,
    avatar: this.constructor(item.Fsinger_mid)
   })
  })
  let ret = []
  let hot = []
  for (let key in map) {
   let val = map[key]
   if (val.title.match(/[a-zA-Z]/)) {
    ret.push(val)
   } else if (val.title === this.data.HOT_NAME) {
    hot.push(val)
   }
  }
  ret.sort((a, b) => {
   return a.title.charCodeAt(0) - b.title.charCodeAt(0)
  })
  return hot.concat(ret)
 },

计算分组高度

var lHeight = [],
  that = this;
let height = 0;
lHeight.push(height);
var query = wx.createSelectorQuery();
query.selectAll('.list-group').boundingClientRect(function(rects){
  var rect = rects,
    len = rect.length;
  for (let i = 0; i < len; i++) {
    height += rect[i].height;
    lHeight.push(height)
  }
 }).exec();
var calHeight = setInterval(function(){
  if (lHeight != [0]) {
    that.setData({
     listHeight: lHeight
    });
  clearInterval(calHeight);
 } 
},1000)

在获取元素属性上,小程序提供了一个很方便的api,wx.createSelectotQuery();具体使用方法请看[节点信息API][3]
使用该方法获取到各分组的高度,存入lHeight中用于之后滚动时判断使用;
同学们可以看到我在将lHeight赋值给data的listHeight时使用了定时器,这是因为获取节点信息api是异步执行的,顾你直接进行赋值是没有效果的,所以我使用了定时器功能;

**我觉得这里使用定时器不是最好的处理方式,同学们有更好的方法请告诉我,谢谢**

对滚动事件进行处理

const listHeight = this.data.listHeight
// 当滚动到顶部,scrollY<0
if (scrollY == 0 || scrollY < 0) {
 this.setData({
  currentIndex:0,
  fixedTitle:''
 })
 return
}
// 在中间部分滚动
for (let i = 0; i < listHeight.length - 1; i++) {
 let height1 = listHeight[i]
 let height2 = listHeight[i + 1]
 if (scrollY >= height1 && scrollY < height2) {
  this.setData({
   currentIndex:i,
   fixedTitle:this.data.logs[i].title
  })
  this.fixedTt(height2 - newY);
  return
 }
}
// 当滚动到底部,且-scrollY大于最后一个元素的上限
this.setData({
 currentIndex: listHeight.length - 2,
 fixedTitle: this.data.logs[listHeight.length - 2].title
})

参数格式

list:[
  {
    "index": "X",
    "name": "薛之谦",
  },
  {
    "index": "Z",
    "name": "周杰伦",
  },
  {
    "index": "B",
    "name": "BIGBANG (빅뱅)",
  },
  {
    "index": "B",
    "name": "陈奕迅",
  },
  {
    "index": "L",
    "name": "林俊杰",
  },
  {
    "index": "A",
    "name": "Alan Walker (艾伦·沃克)",
  },
]

最后

完整代码请戳 gitHub

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
学习YUI.Ext第五日--做拖放Darg&amp;Drop
Mar 10 Javascript
jQuery 选择器项目实例分析及实现代码
Dec 28 Javascript
Js 回车换行处理的办法及replace方法应用
Jan 24 Javascript
JavaScript Sort 的一个错误用法示例
Mar 20 Javascript
jquery实现从数组移除指定的值
Jun 24 Javascript
微信企业号开发之微信考勤百度地图定位
Sep 11 Javascript
两款JS脚本判断手机浏览器类型跳转WAP手机网站
Oct 16 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
Jun 12 Javascript
Vue开发过程中遇到的疑惑知识点总结
Jan 20 Javascript
node学习记录之搭建web服务器教程
Feb 16 Javascript
JavaScript中offsetWidth的bug及解决方法
May 17 Javascript
详解如何实现一个简单的Node.js脚手架
Dec 04 Javascript
Vue弹出菜单功能的实现代码
Sep 12 #Javascript
angular4中*ngFor不能对返回来的对象进行循环的解决方法
Sep 12 #Javascript
详解SPA中前端路由基本原理与实现方式
Sep 12 #Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
Sep 12 #Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
Sep 12 #Javascript
Vue $emit $refs子父组件间方法的调用实例
Sep 12 #Javascript
bootstrap table表格插件之服务器端分页实例代码
Sep 12 #Javascript
You might like
php扩展ZF――Validate扩展
2008/01/10 PHP
php实现水仙花数的4个示例分享
2014/04/08 PHP
php中session与cookie的比较
2015/01/27 PHP
PHP中数据类型转换的三种方式
2015/04/02 PHP
PHP使用preg_split()分割特殊字符(元字符等)的方法分析
2017/02/04 PHP
PHP扩展类型及安装方式解析
2020/04/27 PHP
自动更新作用
2006/10/08 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
基于JQuery实现的Select级联
2014/01/27 Javascript
jQuery中:first选择器用法实例
2014/12/30 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
JS多文件上传的实例代码
2017/01/11 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
ReactNative踩坑之配置调试端口的解决方法
2017/07/28 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
2017/08/11 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
Python实现全局变量的两个解决方法
2014/07/03 Python
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
2015/04/25 Python
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
Python 装饰器实现DRY(不重复代码)原则
2018/03/05 Python
编写多线程Python服务器 最适合基础
2018/09/14 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
2019/10/06 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
商务日语毕业生自荐信
2013/11/23 职场文书
回门宴新郎答谢词
2014/01/12 职场文书
2014升学宴答谢词
2014/01/26 职场文书
家长寄语大全
2014/04/02 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
2014国庆节标语口号
2014/09/19 职场文书
婚礼嘉宾致辞
2015/07/28 职场文书
《日月潭》教学反思
2016/02/20 职场文书