微信小程序全國(guó)城市列表索引開發(fā)案例

在一些需求中杉适,我們需要有一個(gè)全國(guó)城市的列表供我們選擇谎倔,并且可以獲得對(duì)應(yīng)的經(jīng)緯度坐標(biāo)。
今天猿推,我們就一起來實(shí)現(xiàn)這個(gè)需求片习。
好,我們先看一下我們期望的最終效果蹬叭,如下圖:


52魔都.png

我們看到左側(cè)有個(gè)下拉選項(xiàng)藕咏,右側(cè)是供搜索的輸入關(guān)鍵字用到的輸入框。
關(guān)于搜索的需求可以看這個(gè)教程使用高德地圖微信小程序SDK開發(fā)案例-輸入提示(附源碼)
我們今天主要實(shí)現(xiàn)如下需求:
1.頁面布局具垫。
2.進(jìn)入頁面自動(dòng)定位當(dāng)前所在的城市侈离。
3.獲取全國(guó)城市列表,并且按照拼音的首字母排序筝蚕。
4.點(diǎn)擊后獲取對(duì)應(yīng)的經(jīng)緯度卦碾。
5.點(diǎn)擊字母跳轉(zhuǎn)到同一類拼音首字母開始的列表铺坞。
知道的要做的事情,咱們就開始擼代碼~

<view class='list-city'>
    <scroll-view scroll-y="true" style="height:100%;"  scroll-into-view="{{scrollTopId}}" scroll-with-animation="true" enable-back-to-top="true">
      <view class='item'>
        <view class='fullname'>當(dāng)前定位城市:{{citySelected}}</view>
      </view>
      <!-- 熱門城市 -->
      <view class='item'>
        <view class='py' id="hot">熱門城市</view>
        <view class="fullname hot-city" wx:for="{{hotCityData}}" wx:key="key" data-fullname="{{item.fullname}}" data-lat="{{item.location.lat}}" data-lng="{{item.location.lng}}" bindtap='selectCity'>{{item.fullname}}
        </view>
      </view>

      <!-- 全部 -->
      <view class='item' wx:for="{{cityData}}" wx:for-index="idx" wx:for-item="group" wx:key="key">
        <view class='py' id="{{idx}}">{{idx}}</view>
        <view class="fullname" wx:for="{{group}}" wx:key="key" data-fullname="{{item.fullname}}" data-lat="{{item.location.lat}}" data-lng="{{item.location.lng}}" bindtap='selectCity'>{{item.fullname}}
        </view>
      </view>

    </scroll-view>

    <!-- 首字母 -->
    <view class='city-py' bindtouchstart="tStart" bindtouchend="tEnd" catchtouchmove="tMove">
      <view wx:for="{{_py}}" wx:key="key" bindtouchstart="getPy" bindtouchend="setPy" id="{{item}}">{{item == 'hot' ? "★" : item}}
      </view>
    </view>
  </view>

這是頁面的主要結(jié)構(gòu)洲胖,我們分為三大塊济榨,熱門城市,全部城市绿映,還是有首字母擒滑。
我們使用循環(huán)來展示城市名稱,并且使用data-fullname="{{item.fullname}}" data-lat="{{item.location.lat}}" data-lng="{{item.location.lng}}" bindtap='selectCity'來記錄對(duì)應(yīng)城市的經(jīng)緯度叉弦,同時(shí)綁定了點(diǎn)擊事件來獲取經(jīng)緯度和城市名稱丐一。
至于頁面右側(cè)字母索引綁定的事件比較復(fù)雜,我們到后面詳細(xì)來講淹冰。
頁面的骨架有了库车,接著可以寫幾行css來美化下頁面。然后我們正式進(jìn)入主要階段樱拴。
我們通過高德地圖微信小程序SDKhttps://lbs.amap.com/api/wx/guide/get-data/regeo提供的接口來直接獲取詳細(xì)地址信息柠衍。

onLoad: function() {
    var that = this;
    var myAmapFun = new amapFile.AMapWX({key:'高德Key'});
    myAmapFun.getRegeo({
      success: function(data){
        //成功回調(diào),獲得當(dāng)前所在城市名稱
        let city = data.regeocodeData.addressComponent.province;
      },
      fail: function(info){
        //失敗回調(diào)
        console.log(info)
      }
    })
  },

或者我們也可以使用騰訊地圖微信小程序SDK https://lbs.qq.com/qqmap_wx_jssdk/method-reverseGeocoder.html 提供的接口來獲取晶乔。因?yàn)槲覀兘酉聛砭鸵褂抿v訊地圖微信小程序SDK珍坊。
第二步我們實(shí)現(xiàn)了,接下來獲取全國(guó)城市列表正罢。
是的阵漏,https://lbs.qq.com/qqmap_wx_jssdk/method-getcitylist.html,在頁面上我們很快發(fā)現(xiàn)了這個(gè)接口腺怯,我們直接調(diào)用袱饭。然而我直接將數(shù)據(jù)保存到了js文件川无。
https://raw.githubusercontent.com/749264345/wechat-miniapp-map/master/libs/city.js
我們根據(jù)數(shù)據(jù)直接賦值到頁面上的參數(shù)呛占,結(jié)果很順利。
很快懦趋,我們到了第四步晾虑,我們?yōu)榱斜淼氖录砑雍瘮?shù)。

   //選擇城市
   selectCity: function (e) {
       var dataset = e.currentTarget.dataset;
       this.setData({
           citySelected: dataset.fullname,
           location: {
               latitude: dataset.lat,
               longitude: dataset.lng
           }
       });
   }

我們獲取到剛才我們?cè)O(shè)置的三個(gè)屬性仅叫,并且保存他們帜篇,以備后續(xù)使用。
是的诫咱,很簡(jiǎn)單笙隙,我們現(xiàn)在差后一步。當(dāng)我們點(diǎn)擊C的時(shí)候坎缭,頁面滾動(dòng)到重慶市竟痰,點(diǎn)擊W的時(shí)候頁面滾動(dòng)到武清區(qū)签钩。。坏快。铅檩。以此類推。
于是我們字母索引添加2個(gè)事件莽鸿,bindtouchstart="getPy" bindtouchend="setPy"昧旨。

  //獲取點(diǎn)擊的字母,在頁面放大上展示
    getPy: function (e) {
        this.setData({
            hidden: false,
            showPy: e.target.id,
        })
    },
  //將設(shè)置到字母祥得,賦值到scrollTopId
    setPy: function (e) {
        this.setData({
            hidden: true,
            scrollTopId: this.data.showPy
        })
    },

不急兔沃,我們慢慢來,這里有幾個(gè)問題级及。
1.賦值到scrollTopId是為什么粘拾?

<scroll-view scroll-y="true" scroll-into-view="{{scrollTopId}}" scroll-with-animation="true" enable-back-to-top="true">

我們看到我們使用了小程序的scroll-view組件,我們將scrollTopId這個(gè)值賦值給了scroll-into-view屬性创千,scroll-with-animation="true" 并且滾動(dòng)時(shí)有滑動(dòng)效果缰雇。


52魔都.png

這個(gè)類似于網(wǎng)頁中的錨點(diǎn),給scroll-into-view賦一個(gè)值X以后追驴,頁面將滾動(dòng)到子元素設(shè)置屬性id='x'的地方械哟。所以我們看到:

<view class='py' id="{{idx}}">{{idx}}</view>

我們?yōu)榱斜碇械乃饕砑恿藢傩詉d。
第二個(gè)問題殿雪,為什么綁定2個(gè)事件暇咆,而不是一個(gè)點(diǎn)擊事件bindtap
這里關(guān)系到我們下一個(gè)需求,就是我們手指點(diǎn)擊索引那一欄之后丙曙,不離開爸业,通過上下滑動(dòng),可以快速預(yù)覽城市列表亏镰,當(dāng)手指離開之后扯旷,列表滾動(dòng)到手指最后停留的那個(gè)字母位置。
而且索抓,我們必須將滑動(dòng)的交互事件綁定到字母索引的外層钧忽,就像我們看到的這樣:

<view class='city-py' bindtouchstart="tStart" bindtouchend="tEnd" catchtouchmove="tMove">
      <view wx:for="{{_py}}" wx:key="key" bindtouchstart="getPy" bindtouchend="setPy" id="{{item}}">
        {{item == 'hot' ? "★" : item}}
      </view>
</view>

當(dāng)我們將getPy有setPy合并到一個(gè)事件中時(shí),我們將無法看到索引字母在頁面中間的效果逼肯,當(dāng)我們手指觸摸到的時(shí)候顯示耸黑,離開的時(shí)候消失,這里是2個(gè)事件篮幢。


52魔都.png

就像這樣大刊,中間字母的預(yù)覽效果。
如果我們將這2個(gè)事件合并到父元素上時(shí)三椿,我們將很難獲取到準(zhǔn)確的字母索引值缺菌,也就是id曲尸。
我們?cè)诟冈厣咸砑恿巳齻€(gè)事件,

    //滑動(dòng)時(shí)
    tMove: function (e) {
        var y = e.touches[0].clientY,
            offsettop = e.currentTarget.offsetTop,
            that = this;

        //判斷選擇區(qū)域,只有在選擇區(qū)才會(huì)生效
        if (y > offsettop) {
            var num = parseInt((y - offsettop) / 12);
            this.setData({
                showPy: that.data._py[num]
            })
        };
    },

    //觸發(fā)全部開始選擇
    tStart: function () {
        this.setData({
            hidden: false
        })
    },

    //觸發(fā)結(jié)束選擇
    tEnd: function () {
        this.setData({
            hidden: true,
            scrollTopId: this.data.showPy
        })
    },

當(dāng)我們?cè)谒饕且粰谏舷禄瑒?dòng)手指的同時(shí)男翰,計(jì)算出當(dāng)前手指可能觸碰到的字母另患,并且當(dāng)且僅當(dāng)手指在元素范圍內(nèi)的時(shí)候觸發(fā)。
可能你覺這些代碼有部分冗余蛾绎,是否可以將tStart與tEnd舍去昆箕?答案是可以的,功能不受影響租冠,但是當(dāng)你在上下滑動(dòng)的過程中鹏倘,可以明顯感到中間索引的提示有明顯的卡頓,這不是我們想要的顽爹。
代碼寫到這里纤泵,基本上已經(jīng)差不多了。
如有更好的實(shí)現(xiàn)方式希望在評(píng)論區(qū)能夠分享镜粤。

詳細(xì)案例請(qǐng)搜索微信小程序:52魔都
源碼地址:https://github.com/749264345/wechat-weapp-map

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捏题,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子肉渴,更是在濱河造成了極大的恐慌公荧,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件同规,死亡現(xiàn)場(chǎng)離奇詭異循狰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)券勺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門绪钥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人关炼,你說我怎么就攤上這事程腹。” “怎么了盗扒?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵跪楞,是天一觀的道長(zhǎng)缀去。 經(jīng)常有香客問我侣灶,道長(zhǎng),這世上最難降的妖魔是什么缕碎? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任褥影,我火速辦了婚禮,結(jié)果婚禮上咏雌,老公的妹妹穿的比我還像新娘凡怎。我一直安慰自己校焦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布统倒。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪艇炎。 梳的紋絲不亂的頭發(fā)上叛拷,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音浴鸿,去河邊找鬼井氢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛岳链,可吹牛的內(nèi)容都是我干的花竞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼掸哑,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼约急!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起苗分,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤烤宙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后俭嘁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躺枕,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年供填,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拐云。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡近她,死狀恐怖叉瘩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粘捎,我是刑警寧澤薇缅,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站攒磨,受9級(jí)特大地震影響泳桦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娩缰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一灸撰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦浮毯、人聲如沸完疫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壳鹤。三九已至,卻和暖如春饰迹,著一層夾襖步出監(jiān)牢的瞬間器虾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工蹦锋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兆沙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓莉掂,卻偏偏與公主長(zhǎng)得像葛圃,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子憎妙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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