当前位置:   article > 正文

uni-app做A-Z排序通讯录、索引列表_uniapp 读取通讯录并根据首字母排序

uniapp 读取通讯录并根据首字母排序

上图是效果图,三个问题

  • 访问电话通讯录,拿数据
  • 拿到用户的联系人数组对象,之后根据A-Z排序
  • 根据字母索引快速搜索

首先说数据怎么拿 - 社区有指导
https://ask.dcloud.net.cn/question/64117 uniapp 调取通讯录

  1. // #ifdef APP-PLUS
  2. plus.contacts.getAddressBook( plus.contacts.ADDRESSBOOK_PHONE, function( addressbook ) {
  3. // 查找联系人
  4. addressbook.find(["displayName","phoneNumbers"],function(contacts){
  5. console.log('获取联系人成功')
  6. console.log(JSON.stringify(contacts)) ; //拿到的数据
  7. }, function () {
  8. uni.showToast({
  9. title: '获取联系人失败',
  10. duration: 2000
  11. })
  12. },{multiple:true});
  13. }, function ( e ) {
  14. alert( "Get address book failed: " + e.message );
  15. })
  16. // #endif

这样就实现了第一步,接下来分析拿到的数据,做处理。

  1. {
  2. "id": 6,
  3. "rawId": null,
  4. "target": 0,
  5. "displayName": "Ann",
  6. "name": null,
  7. "nickname": null,
  8. "phoneNumbers": [{
  9. "id": 0,
  10. "pref": false,
  11. "type": "home",
  12. "value": "895694582"
  13. }],
  14. "emails": null,
  15. "addresses": null,
  16. "ims": null,
  17. "organizations": null,
  18. "birthday": null,
  19. "note": null,
  20. "photos": null,
  21. "categories": null,
  22. "urls": null }

从这部分数据看,有用到的是

{displayName:"Ann", "phoneNumbers":[ ... ]}

我们将换成另一种数据结果

  1. pySort:function(arrList){
  2. var $this = this;
  3. if(!String.prototype.localeCompare)
  4. return null;
  5. var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ#".split('');//ABCDEFGHJKLMNOPQRSTWXYZ
  6. var zh = "阿八嚓哒妸发旮哈*讥咔垃痳拏噢妑七呥涩它**穵夕丫帀".split('');
  7. var result = [];
  8. var curr;
  9. for(let i=0;i<letters.length;i++){
  10. curr = {letter: letters[i], data:[]}; //字母对象,data数据
  11. arrList.forEach((n)=>{
  12. let initial = n.displayName.charAt(0);//截取第一个字符
  13. if(initial==letters[i]||initial==letters[i].toLowerCase()){//首字符是英文的
  14. curr.data.push(n);
  15. }else if(zh[i]!=='*'&&$this.isChinese(initial)){//判断是否是无汉字,是否是中文
  16. let chinaName = pinyin.getFullChars(initial).charAt(0); //直接使用pinyin中方法
  17. if(chinaName==letters[i]||chinaName==letters[i].toLowerCase()){//首字符是英文的
  18. curr.data.push(n);
  19. }
  20. }
  21. if(letters[i]=='#'&&!$this.isChar(initial)&&!$this.isChinese(initial)){
  22. curr.data.push(n);
  23. }
  24. })
  25. result.push(curr)
  26. }
  27. this.contactList = result; //contactList 是data中定义的 []
  28. },
  29. isChinese:function(temp){
  30. var re=/[^\u4E00-\u9FA5]/;
  31. if (re.test(temp)){return false;}
  32. return true ;
  33. },
  34. isChar:function(char){
  35. var reg = /[A-Za-z]/;
  36. if (!reg.test(char)){return false ;}
  37. return true ;
  38. },

截取姓名的首字符,英文可以直接比对;数字字符也可以直接比对;中文需要将转成拼音再取首字母

汉字转拼音js下载路径:(如果无效,自行处理)
链接:https://pan.baidu.com/s/1NZ4noIgHv2HSzZW6yBRTxA 密码:2kv1

注意的是,下载的这份js不能直接在vue项目中使用,需要在js文件中加

  1. export{
  2. pinyin
  3. }
  4. //页面引入
  5. import {pinyin} from '../../common/Convert_Pinyin.js';

这样排序做完。接下来就是索引部分。
其实可以直接使用插件市场的插件,地址附上(https://ext.dcloud.net.cn/plugin?id=375#detail)
但是可以更简单

  1. <scroll-view class="scroll-list" :scroll-into-view="scrollViewId" scroll-y="true" scroll-with-animation :style="{height:winHeight + 'px'}">
  2. <view v-for="(item,index) in contactList" :key="index" :id="item.letter == '#' ? 'indexed-list-YZ' :'indexed-list-' + item.letter">
  3. <view class="letter-title" v-if="item.data&&item.data.length" id="item.letter">{{item.letter}}</view>
  4. <view> .......</view>
  5. </view>
  6. </scroll-view>
  7. <view class="right-menu">
  8. <view v-for="(i,index) in Letters" :key="index" @click="jumper(i,index)" :class="jumperIndex == i?'letter-item active':'letter-item'">{{i}}</view>
  9. </view>

这里的scroll-view是关键,scroll-view


scroll-into-view 与 子元素的id结合使用。

  1. data() {
  2. return {
  3. jumperIndex:'A',
  4. contactList:[],
  5. scrollViewId:'',
  6. winHeight: 0,
  7. itemHeight: 0,
  8. Letters:['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','#'],
  9. }
  10. },
  11. methods:{
  12. jumper(event,i){
  13. this.jumperIndex = event;
  14. let len = this.contactList[i].data.length;
  15. if(event == '#'){
  16. this.scrollViewId = 'indexed-list-YZ';
  17. return
  18. }
  19. if(len>0){
  20. console.log(111);
  21. this.scrollViewId = 'indexed-list-' + event;
  22. }
  23. },
  24. },
  25. onLoad(){
  26. let winHeight = uni.getSystemInfoSync().windowHeight;
  27. this.itemHeight = winHeight / 26;
  28. this.winHeight = winHeight;
  29. },

主要代码,主要功能完结。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/698518
推荐阅读
相关标签
  

闽ICP备14008679号