手把手Vue移动端使用vant完成索引栏功能

背景

写选择手机号码前缀功能,需要使用索引栏,遂到框架内找到,并在网上找到数据


image.png

image.png

开始

1.安装vant:https://vant-contrib.gitee.io/vant/#/zh-CN/index-bar
vant 上有写好的框架,能省很多力气,我一向是有框架绝对不自己写轮子

2.数据

export let country = {
    'hot': [
        ["中国大陆", "+86"],
        ["香港", "+852"],
        ["澳门", "+853"],
        ["台湾", "+886"],
        ["美国", "+1"],
        ["日本", "+81"],
    ],
    "A": [
        ["阿尔巴尼亚", "+355"],
        ["阿尔及利亚", "+213"],
        ["阿富汗", "+93"],
        ["阿根廷", "+54"],
        ["阿鲁巴岛", "+297"],
        ["阿曼", "+968"],
        ["阿塞拜疆", "+994"],
        ["阿森松(英)", "+247"],
        ["埃及", "+20"],
        ["埃塞俄比亚", "+251"],
        ["爱尔兰", "+353"],
        ["爱沙尼亚", "+372"],
        ["安道尔", "+376"],
        ["安哥拉", "+244"],
        ["安圭拉岛(英)", "+1264"],
        ["安提瓜和巴布达", "+1268"],
        ["奥地利", "+43"],
        ["澳大利亚", "+61"],
        ["澳门", "+853"],
    ],
    'B': [
        ["巴巴多斯", "+1246"],
        ["巴布亚新几内亚", "+675"],
        ["巴哈马国", "+1242"],
        ["巴基斯坦", "+92"],
        ["巴拉圭", "+595"],
        ["巴林", "+973"],
        ["巴拿马", "+507"],
        ["巴西", "+55"],
        ["白俄罗斯", "+375"],
        ["百慕大群岛(英)", "+1441"],
        ["保加利亚", "+359"],
        ["贝宁", "+229"],
        ["比利时", "+32"],
        ["冰岛", "+354"],
        ["波多黎各(美)", "+1"],
        ["波兰", "+48"],
        ["波斯尼亚和黑塞哥维那", "+387"],
        ["玻利维亚", "+591"],
        ["伯利兹", "+501"],
        ["博茨瓦纳", "+267"],
        ["不丹", "+975"],
        ["布基纳法索", "+226"],
        ["布隆迪", "+257"],
    ],
    'C': [
        ["朝鲜", "+850"],
        ["赤道几内亚", "+240"],
    ],
    'D': [
        ["丹麦", "+45"],
        ["德国", "+49"],
        ["东萨摩亚(美)", "+1684"],
        ["多哥", "+228"],
        ["多米尼加共和国", "+1809"],
        ["多米尼克国", "+1767"],
    ],
    'E': [
        ["俄罗斯", "+7"],
        ["厄瓜多尔", "+593"],
        ["厄立特里亚", "+291"],
    ],
    'F': [
        ["法国", "+33"],
        ["法罗群岛(丹)", "+298"],
        ["法属波里尼西亚", "+689"],
        ["梵蒂冈", "+14397"],
        ["菲律宾", "+63"],
        ["斐济", "+679"],
        ["芬兰", "+358"],
        ["佛得角", "+238"],
        ["福克兰群岛", "+500"],
    ],
    'G': [
        ["冈比亚", "+220"],
        ["刚果", "+242"],
        ["哥伦比亚", "+57"],
        ["哥斯达黎加", "+506"],
        ["格林纳达", "+1473"],
        ["格陵兰岛", "+299"],
        ["格鲁吉亚", "+995"],
        ["古巴", "+53"],
        ["瓜德罗普岛(法)", "+590"],
        ["关岛(美)", "+1671"],
        ["圭亚那", "+592"],
    ],
    'H': [
        ["哈萨克斯坦", "+7"],
        ["海地", "+509"],
        ["韩国", "+82"],
        ["荷兰", "+31"],
        ["荷属安的列斯群岛", "+599"],
        ["洪都拉斯", "+504"],
        ["基里巴斯", "+686"],
    ],
    'J': [
        ["吉布提", "+253"],
        ["吉尔吉斯斯坦", "+996"],
        ["几内亚", "+224"],
        ["几内亚比绍", "+245"],
        ["加拿大", "+1"],
        ["加纳", "+233"],
        ["加蓬", "+241"],
        ["柬埔塞", "+855"],
        ["捷克", "+420"],
        ["津巴布韦", "+263"],
    ],
    'K': [
        ["喀麦隆", "+237"],
        ["卡塔尔", "+974"],
        ["开曼群岛(英)", "+1345"],
        ["科科斯岛", "+61"],
        ["科克群岛(新)", "+682"],
        ["科摩罗", "+269"],
        ["科特迪瓦", "+225"],
        ["科威特", "+965"],
        ["克罗地亚", "+385"],
        ["肯尼亚", "+254"],
    ],
    'L': [
        ["拉脱维亚", "+371"],
        ["莱索托", "+266"],
        ["老挝", "+856"],
        ["黎巴嫩", "+961"],
        ["立陶宛", "+370"],
        ["利比里亚", "+231"],
        ["利比亚", "+218"],
        ["列支敦士登", "+423"],
        ["留尼汪岛", "+262"],
        ["卢森堡", "+352"],
        ["卢旺达", "+250"],
        ["罗马尼亚", "+40"],
    ],
    'M': [
        ["马达加斯加", "+261"],
        ["马尔代夫", "+960"],
        ["马耳他", "+356"],
        ["马拉维", "+265"],
        ["马来西亚", "+60"],
        ["马里", "+223"],
        ["马里亚纳群岛", "+1670"],
        ["马其顿", "+389"],
        ["马绍尔群岛", "+692"],
        ["马提尼克(法)", "+596"],
        ["马约特岛", "+262"],
        ["毛里求斯", "+230"],
        ["毛里塔尼亚", "+222"],
        ["美国", "+1"],
        ["蒙古", "+976"],
        ["蒙特塞拉特岛(英)", "+1664"],
        ["孟加拉国", "+880"],
        ["秘鲁", "+51"],
        ["密克罗尼西亚(美)", "+691"],
        ["缅甸", "+95"],
        ["摩尔多瓦", "+373"],
        ["摩洛哥", "+212"],
        ["摩纳哥", "+377"],
        ["莫桑比克", "+258"],
        ["墨西哥", "+52"],
    ],
    'N': [
        ["纳米比亚", "+264"],
        ["南非", "+27"],
        ["南斯拉夫", "+381"],
        ["瑙鲁", "+674"],
        ["尼泊尔", "+977"],
        ["尼加拉瓜", "+505"],
        ["尼日尔", "+227"],
        ["尼日利亚", "+234"],
        ["纽埃岛(新)", "+683"],
        ["挪威", "+47"],
        ["诺福克岛(澳)", "+672"],
    ],
    'P': [
        ["帕劳(美)", "+680"],
        ["葡萄牙", "+351"],
    ],
    'R': [
        ["日本", "+81"],
        ["瑞典", "+46"],
        ["瑞士", "+41"],
    ],
    'S': [
        ["萨尔瓦多", "+503"],
        ["塞拉利昂", "+232"],
        ["塞内加尔", "+221"],
        ["塞浦路斯", "+357"],
        ["塞舌尔", "+248"],
        ["桑给巴尔", "+259"],
        ["沙特阿拉伯", "+966"],
        ["圣诞岛", "+61"],
        ["圣多美和普林西比", "+239"],
        ["圣赫勒拿", "+290"],
        ["圣克里斯托弗和尼维斯", "+1869"],
        ["圣卢西亚", "+1758"],
        ["圣马力诺", "+378"],
        ["圣皮埃尔岛及密克隆岛", "+508"],
        ["圣文森特岛(英)", "+1784"],
        ["斯里兰卡", "+94"],
        ["斯洛伐克", "+421"],
        ["斯洛文尼亚", "+386"],
        ["斯威士兰", "+268"],
        ["苏丹", "+249"],
        ["苏里南", "+597"],
        ["所罗门群岛", "+677"],
        ["索马里", "+252"],
    ],
    'T': [
        ["塔吉克斯坦", "+992"],
        ["台湾", "+886"],
        ["泰国", "+66"],
        ["坦桑尼亚", "+255"],
        ["汤加", "+676"],
        ["特克斯和凯科斯群岛(英)", "+1649"],
        ["特立尼达和多巴哥", "+1868"],
        ["突尼斯", "+216"],
        ["图瓦卢", "+688"],
        ["土耳其", "+90"],
        ["土库曼斯坦", "+993"],
    ],
    'W': [
        ["瓦努阿图", "+678"],
        ["危地马拉", "+502"],
        ["维尔京群岛(英)", "+1340"],
        ["委内瑞拉", "+58"],
        ["乌干达", "+256"],
        ["乌克兰", "+380"],
        ["乌拉圭", "+598"],
        ["乌兹别克斯坦", "+998"],
    ],
    'X': [
        ["西班牙", "+34"],
        ["西萨摩亚", "+685"],
        ["希腊", "+30"],
        ["香港", "+852"],
        ["新加坡", "+65"],
        ["新喀里多尼亚群岛(法)", "+687"],
        ["新西兰", "+64"],
        ["匈牙利", "+36"],
        ["叙利亚", "+963"],
    ],
    'Y': [
        ["牙买加", "+1876"],
        ["亚美尼亚", "+374"],
        ["也门", "+967"],
        ["伊拉克", "+964"],
        ["伊郎", "+98"],
        ["以色列", "+972"],
        ["意大利", "+39"],
        ["印度", "+91"],
        ["印度尼西亚", "+62"],
        ["英国", "+44"],
        ["约旦", "+962"],
        ["越南", "+84"],
    ],
    'Z': [
        ["赞比亚", "+260"],
        ["乍得", "+235"],
        ["直布罗陀(英)", "+350"],
        ["智利", "+56"],
        ["中非", "+236"],
        ["中国大陆", "+86"],
    ],
}

3.引入数据

import { country } from "../../util/phonePrefix";

4.实例

 return {
      indexList: [],
      dataList: {},
    };

5.开始了,其实很简单,就是逻辑问题

  created() {
    this.indexList = Object.keys(country); //获取到key数组,用作侧边索引
    console.log(Object.keys(country))// ["hot", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "W", "X", "Y", "Z"]
    this.dataList = country;                //数据
  },

6.遍历

<van-index-bar :index-list="indexList" sticky>   //这个功能官方已经写好,我们把刚才获取的侧边索引数组填入就自动生成侧边索引了
        <div v-for="(item, index) in dataList" :key="index">  // 根据上面的数据得知,我们用脚指头都知道循环两次,我们循环一次,得到的就是数组内对应的key数据了
          <van-index-anchor :index="index">  
            {{ index }}   //因为我们的数据key不是数字,而是我们的索引,所以直接写index,自然就显示成标题了
          </van-index-anchor>
          <div
            v-for="(test, inde) in item"    //循环第二次,把对应的key进行循环,得到key里面的每个小数据,别犹豫按着写就完事了,
            :key="inde"
            class="cell"
            :data-num="test[1]"
            @click="getPhoneNum($event)"
          >
            <span>{{ test[0] }}</span>    //这里就不用循环了,直接填
            <span>{{ test[1] }}</span>
          </div>
        </div>
 </van-index-bar>

总结:

本来没想写成博客,首先这个功能大家一看感觉很高大上,自己不好实现,再加上网上很多代码给的方法不对,导致会走弯路,我都是没事逛框架网站,基本都知道哪个网站有什么功能,我只是码农,以实现功能为主

回归正题:有个群友说如果key是动态的,数据也是动态,怎么办. 目前已经解决,我们通过获取数据的key组成索引, 这样保证key是动态的,循环数据这边小白可以一步一步来,先打印出来看看,从外循环到内, 首先我们得到的是一整个数据,循环第一次得到每块数据,每块数据的index就是标题a,b,c,d那些,我们再循环item,得到每小块数据, 我说的还算明白把?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容