前端 | 按首字母排序的省市區(qū)三聯(lián)控件

需求是一個省市區(qū)三聯(lián)控件秩彤,先選擇省,再選擇市览徒,最后是區(qū)狈定,并且按首字母分類排序

如下圖:


分別選擇省市區(qū)

思路是找一個帶首字母帶全國地址json數(shù)據(jù)就搞定了,哈哈哈习蓬,但是并找不到纽什,那么就自己創(chuàng)建一個呀!

這里用到的輔助工具庫有:1躲叼、lodash 2芦缰、pinyin

一、首先下載一個包含全國地址的json數(shù)據(jù)

傳送門:https://github.com/huangyilu/nationalAddressJSON/blob/master/address_data.json

包含全國地址的json數(shù)據(jù)

分析一下這個數(shù)據(jù):1枫慷、沒有排序 2让蕾、沒有按首字母區(qū)分組

二、修改json數(shù)據(jù)

我們現(xiàn)在已經(jīng)有了全國的地址數(shù)據(jù)或听,那么可以利用漢字轉(zhuǎn)拼音取首字母的方式探孝,對數(shù)據(jù)進(jìn)行分組并排序。
漢字轉(zhuǎn)拼音在npm上有很多神帅,這里用的是第一個。

這個pinyin包萌抵,在iOS 9.x.x上找御,會出錯,所以我們只是利用他來作為輔助工具生成我們自己的json數(shù)據(jù)

pinyin_npm.png

對數(shù)據(jù)進(jìn)行處理需要借助lodash(一個一致性绍填、模塊化霎桅、高性能的 JavaScript 實用工具庫)
分組用的是groupBy方法(https://www.lodashjs.com/docs/4.17.5.html#groupBy
排序用的是sortBy方法(https://www.lodashjs.com/docs/4.17.5.html#sortBy
先排序后分組,最后生成的數(shù)據(jù):
address_final.png

json文件我都放在(https://github.com/huangyilu/nationalAddressJSON/blob/master/address_final_data.json)這里啦讨永,需要的可以自行下載

三滔驶、根據(jù)key渲染html

最后一步,我們已經(jīng)有了分好組并排好序的數(shù)據(jù)了卿闹,那么只需要利用tabIndex控制省市區(qū)顯示順序揭糕,key值作為字母標(biāo)題即可完成萝快。

<template>
  <div class="help-address-province-item">
    <div class="hap-title__icon">
      <div class="back-icon" @click="bindGoBackFn"></div>
      <div>選擇地址</div>
      <div class="cancel-icon" @click="bindCancelFn"></div>
    </div>

    <div class="hap-title__item">
      <div :class="['item-tit', { 'active' : tabIndex===1 }]">{{ province }}</div>
      <div :class="['item-tit', { 'active' : tabIndex===2 }]" v-if="tabIndex>1">{{ city }}</div>
      <div :class="['item-tit', { 'active' : tabIndex===3 }]" v-if="tabIndex>2">{{ area }}</div>
    </div>

    <div class="hap-title__content">
      <!-- 省 -->
      <div
        class="content-item"
        v-for="(value, key, index) in addressData"
        :key="index"
        v-if="tabIndex===1"
      >
        <div class="item__key">{{ key }}</div>
        <div class="item__pro">
          <div
            :class="['item', { 'pro-bottom-none': proi+1 === value.length || value.length <= 1 }]"
            v-for="(proItem, proi) in value"
            :key="proi"
            @click="bindProFn(key, proi)"
          >
            <div class="name">{{ proItem.name }}</div>
            <div class="select-icon" v-if="proItem.name === province"></div>
          </div>
        </div>
      </div>
      <!-- 市 -->
      <div
        class="content-item"
        v-for="(value, key, index) in cityData"
        :key="index"
        v-if="tabIndex===2"
      >
        <div class="item__key">{{ key }}</div>
        <div class="item__pro">
          <div
            :class="['item', { 'pro-bottom-none': cityi+1 === value.length || value.length <= 1}]"
            v-for="(cityItem, cityi) in value"
            :key="cityi"
            @click="bindCityFn(key, cityi)"
          >
            <div class="name">{{ cityItem.name }}</div>
            <div class="select-icon" v-if="cityItem.name === city"></div>
          </div>
        </div>
      </div>
      <!-- 區(qū) -->
      <div
        class="content-item"
        v-for="(value, key, index) in areaData"
        :key="index"
        v-if="tabIndex===3"
      >
        <div class="item__key">{{ key }}</div>
        <div class="item__pro">
          <div
            :class="['item', { 'pro-bottom-none': areai+1 === value.length || value.length <= 1}]"
            v-for="(areaItem, areai) in value"
            :key="areai"
            @click="bindAreaFn(key, areai)"
          >
            <div class="name">{{ areaItem }}</div>
            <div class="select-icon" v-if="areaItem === area"></div>
          </div>
        </div>
      </div>
    </div>

    <div
      class="help-confm__btn"
      :class="{ 'iphonex-bottom' : isIphoneX }"
      @click="bindAddressConfm"
    >確認(rèn)</div>
  </div>
</template>
四、最終效果
address.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末著角,一起剝皮案震驚了整個濱河市揪漩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吏口,老刑警劉巖奄容,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異产徊,居然都是意外死亡昂勒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門舟铜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戈盈,“玉大人,你說我怎么就攤上這事深滚∞忍罚” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵痴荐,是天一觀的道長血柳。 經(jīng)常有香客問我,道長生兆,這世上最難降的妖魔是什么难捌? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮鸦难,結(jié)果婚禮上根吁,老公的妹妹穿的比我還像新娘。我一直安慰自己合蔽,他們只是感情好击敌,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拴事,像睡著了一般沃斤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刃宵,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天衡瓶,我揣著相機(jī)與錄音,去河邊找鬼牲证。 笑死哮针,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播十厢,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼等太,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了寿烟?” 一聲冷哼從身側(cè)響起澈驼,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎筛武,沒想到半個月后缝其,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡徘六,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年内边,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片待锈。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡漠其,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竿音,到底是詐尸還是另有隱情和屎,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布春瞬,位于F島的核電站柴信,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宽气。R本人自食惡果不足惜随常,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萄涯。 院中可真熱鬧绪氛,春花似錦、人聲如沸涝影。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽燃逻。三九已至序目,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唆樊,已是汗流浹背宛琅。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工刻蟹, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留逗旁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像片效,于是被迫代替她去往敵國和親红伦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容