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


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 相关文章推荐
js实现运行代码需要刷新的解决方法
Aug 18 Javascript
javascript encodeURI和encodeURIComponent的比较
Apr 03 Javascript
JavaScript中yield实用简洁实现方式
Jun 12 Javascript
异步javascript的原理和实现技巧介绍
Nov 08 Javascript
jQuery的显示和隐藏方法与css隐藏的样式对比
Oct 18 Javascript
js给selected添加options的方法
May 06 Javascript
jQuery实现带渐显效果的人物多级关系图代码
Oct 16 Javascript
利用D3.js实现最简单的柱状图示例代码
Dec 09 Javascript
浅谈Angular4中常用管道
Sep 27 Javascript
微信小程序国际化探索实现(附源码地址)
May 20 Javascript
Bootstrap table 服务器端分页功能实现方法示例
Jun 01 Javascript
Node.js 中判断一个文件是否存在
Aug 24 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
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
tp5.1 实现setInc字段自动加1
2019/10/18 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
ASP小贴士/ASP Tips javascript tips可以当桌面
2009/12/10 Javascript
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
简介AngularJS的视图功能应用
2015/06/17 Javascript
jQuery实现图片局部放大镜效果
2016/03/17 Javascript
BootStrap glyphicons 字体图标实现方法
2016/05/01 Javascript
jquery获取复选框checkbox的值实现方法
2016/05/30 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
Vue应用部署到服务器的正确方式
2017/07/15 Javascript
angular+ionic返回上一页并刷新页面
2017/08/08 Javascript
微信小程序动态添加view组件的实例代码
2019/05/23 Javascript
解决layui checkbox 提交多个值的问题
2019/09/02 Javascript
javascript实现打砖块小游戏(附完整源码)
2020/09/18 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
[07:48]DOTA2上海特级锦标赛主赛事首日RECAP
2016/03/04 DOTA
[36:05]DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs Optic
2018/04/01 DOTA
简单介绍Python2.x版本中的cmp()方法的使用
2015/05/20 Python
python导出chrome书签到markdown文件的实例代码
2017/12/27 Python
Python迭代器与生成器基本用法分析
2018/07/26 Python
python学生信息管理系统(初级版)
2018/10/17 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
Python 支付整合开发包的实现
2019/01/23 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
2019/08/13 Python
自适应线性神经网络Adaline的python实现详解
2019/09/30 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
英国户外玩具儿童游乐设备网站:TP Toys(蹦床、攀爬框架、秋千、滑梯和游戏屋)
2018/04/09 全球购物
国外软件测试工程师面试题
2016/12/09 面试题
幼儿园消防演练方案
2014/02/13 职场文书
公司委托书范本5篇
2014/09/20 职场文书
幼儿园开学家长寄语(2015秋季)
2015/05/27 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书