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


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 相关文章推荐
一些相见恨晚的 JavaScript 技巧
Apr 25 Javascript
jQuery.query.js 取参数的两点问题分析
Aug 06 Javascript
jquery中表单 多选框的一种巧妙写法
Sep 06 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
Aug 01 Javascript
利用js编写响应式侧边栏
Sep 17 Javascript
js实现上传图片预览方法
Oct 25 Javascript
JS实现div模块的截图并下载功能
Oct 17 Javascript
node.js之基础加密算法模块crypto详解
Sep 11 Javascript
详解如何使用router-link对象方式传递参数?
May 02 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
Feb 14 Javascript
js实现拾色器插件(ColorPicker)
May 21 Javascript
jquery实现鼠标悬浮弹出气泡提示框
Dec 23 jQuery
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编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
php截取后台登陆密码的代码
2012/05/05 PHP
使用phpQuery采集网页的方法
2013/11/13 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
PHP执行系统命令函数实例讲解
2021/03/03 PHP
使用jQuery避免鼠标双击的解决方案
2013/08/21 Javascript
js页面跳转的常用方法整理
2013/10/18 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
跟我学习javascript的定时器
2015/11/19 Javascript
ES6概念 ymbol.for()方法
2016/12/25 Javascript
bootstrap table动态加载数据示例代码
2017/03/25 Javascript
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
javascript 面向对象实战思想分享
2017/09/07 Javascript
vue-router 路由基础的详解
2017/10/17 Javascript
Angular实现的简单查询天气预报功能示例
2017/12/27 Javascript
实时监控input框,实现输入框与下拉框联动的实例
2018/01/23 Javascript
Python处理CSV与List的转换方法
2018/04/19 Python
Python 中的range(),以及列表切片方法
2018/07/02 Python
Python使用pyodbc访问数据库操作方法详解
2018/07/05 Python
浅谈Python爬虫基本套路
2019/03/25 Python
Django 1.10以上版本 url 配置注意事项详解
2019/08/05 Python
python中使用you-get库批量在线下载bilibili视频的教程
2020/03/10 Python
Python基于pillow库实现生成图片水印
2020/09/14 Python
PyCharm+Miniconda3安装配置教程详解
2021/02/16 Python
香港中原电器网上商店:Chung Yuen
2019/06/26 全球购物
阿迪达斯新加坡官方网站:adidas新加坡
2019/12/06 全球购物
FirstCry阿联酋儿童和婴儿产品网上购物:FirstCry.ae
2021/02/22 全球购物
什么是规则表达式
2012/05/03 面试题
国培远程培训感言
2014/03/08 职场文书
教学改革实施方案
2014/03/31 职场文书
2016年中秋节慰问信
2015/12/01 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书