小程序中實(shí)現(xiàn)城市選擇列表

直入主題抵窒,實(shí)現(xiàn)什么蛇皮東西呢弛针?大概是這個(gè)樣子:

image.png

點(diǎn)擊右邊字母表的某個(gè)字母能跳轉(zhuǎn),然后搜索:
image.png

先一步一步來李皇,首先渲染出這個(gè)城市列表削茁,為了方便而且中國的城市名稱基本不會有變動,所以我直接把城市的數(shù)據(jù)全部寫在一個(gè)對象里面導(dǎo)出掉房,當(dāng)然不可能手寫茧跋,大家百度就可以拿得到,這里我提供一個(gè):中國所有城市按拼音排序json文件
然后大家把這個(gè)文件的 cities對象整個(gè)復(fù)制出來卓囚,在你的小程序的某個(gè)js文件中:
image.png

然后在你要用的地方就可以引用:

import {citys} from '../../base/citys.js'  // 你的路徑

這樣就可以得到全部城市的信息瘾杭,然后去遍歷,但是這個(gè)citys是個(gè)對象哪亿,在小程序中去wx:for一個(gè)對象粥烁,然后對象的每個(gè)屬性才是數(shù)組,會是怎么樣的呢蝇棉?
其實(shí)就是跟遍歷二維數(shù)組一樣讨阻,進(jìn)行雙層遍歷,然后區(qū)別我在下面再講银萍,先看代碼:

<view wx:for="{{citys}}"
          wx:for-index="key"  // 重命名wx:for的索引
          wx:for-item="value"  // 重命名wx:for的循環(huán)項(xiàng)
          wx:key="{{key}}">
  <view id="{{key}}" class="search-title">{{key}}</view>  // 每一組的標(biāo)題也就是A变勇、B、C...
  <view wx:for="{{value}}"
            wx:key="{{index}}"
            class="item-label">
    <text>{{item.name}}</text>
  </view>
</view>

第一層循環(huán)是去循環(huán)對象贴唇,wx:for的索引名稱默認(rèn)是index搀绣,如果是去遍歷對象,那這個(gè)索引就是對象的key戳气,也就是ABCD捂寿,所以我將它改名為key柠傍,然后將每一個(gè)循環(huán)項(xiàng)的名稱改為value,就是上面的每一個(gè)數(shù)組,第二層遍歷就是正常的遍歷數(shù)組叶堆,這樣就可以遍歷出整個(gè)城市列表。

  • 接下來是右邊的字母表
    拿同樣的數(shù)據(jù)去遍歷就可以秦躯,這次只需要顯示出對象的key就可以:
<view class="alphabet">
  <view wx:for="{{citys}}"
            wx:for-index="key"
            wx:key="{{key}}"
            class="alphabet-item"
            catchtap="chooseCitys"
            data-id="{{key}}">
            {{key}}
  </view>
</view>

接下來是實(shí)現(xiàn)點(diǎn)擊字母表的字母跳轉(zhuǎn)到列表的指定位置件蚕,看我上面的兩段代碼,在城市列表的每一組標(biāo)題我給綁定了id夜赵,是用對象的key綁定明棍,也就是A、B寇僧、C摊腋、D...沸版,然后在字母表的每一個(gè)字母也綁定了自定義屬性data-id,同樣也是用key綁定兴蒸,這樣和上面的標(biāo)題對應(yīng)上视粮,接下來就是實(shí)現(xiàn)。
首先我們要跳轉(zhuǎn)到指定位置橙凳,超人鴨看了小程序的組件文檔蕾殴,發(fā)現(xiàn)了一個(gè)叫scroll-view的組件,這是它的部分屬性:


image.png

我圈住的屬性就是實(shí)現(xiàn)跳轉(zhuǎn)的關(guān)鍵痕惋,傳入一個(gè)元素id区宇,就可以跳轉(zhuǎn)到指定元素的位置,我們把城市列表都包裹中scroll-view組件里面值戳,并寫上相應(yīng)屬性:

<scroll-view scroll-y="true"
             style="height:100%;"
             scroll-into-view="{{id}}">
  // 城市列表
</scroll-view>

這里需要注意的一個(gè)點(diǎn)是設(shè)置scroll-view組件的方向?yàn)榭v向的時(shí)候需要為組件指定高度议谷。
給scroll-into-view動態(tài)的綁定一個(gè)id,需要在data中定義id這個(gè)變量
然后在字母表的點(diǎn)擊事件中改變這個(gè)id堕虹,記得我們上面給每個(gè)字母綁定了自定義屬性data-id="{{key}}"卧晓,在點(diǎn)擊事件中可以拿到:

  chooseCitys(event) {  // 點(diǎn)擊字母表跳轉(zhuǎn)到指定的城市列表
    const id = event.target.dataset.id
    console.log(id)
    this.setData({
      id
    })
  }

這樣就完成了點(diǎn)擊字母表進(jìn)行跳轉(zhuǎn)的功能,接下來是搜索赴捞,回到一開始的城市列表數(shù)據(jù)逼裆,每個(gè)城市都有中文名和拼音,所以可以實(shí)現(xiàn)通過名稱或者拼音實(shí)現(xiàn)搜索赦政,這是搜索框:

<input class="search-input" placeholder="請輸入城市中文名或拼音" bindinput="handleInput"></input>

然后先看我一開始貼的demo圖胜宇,搜索之后,整個(gè)頁面是顯示搜索結(jié)果恢着,我自己的實(shí)現(xiàn)方式是在原來的頁面上加一個(gè)層桐愉,設(shè)置z-index遮住原來的頁面,先看看wxml:

<view class="search-content" hidden="{{!isShow}}">
  <scroll-view scroll-y style="height:100%;">
    <view wx:for="{{searchCitys}}" wx:key="{{index}}">
      <text>{{item.name}}</text>
    </view>
    <view wx:if="{{!searchCitys.length}}">沒有匹配數(shù)據(jù)</view>
  </scroll-view>
</view>

看看這一個(gè)view的樣式:

.search-content{
  position: absolute;
  top: 110rpx;  // 搜索框的高度
  left: 0;
  bottom: 0;
  right: 0;
  z-index: 3;
}

然后上面定義兩個(gè)變量掰派,一個(gè)是isShow控制這一層的出現(xiàn)與消失从诲,第二個(gè)是searchCitys,也就是搜索出來的結(jié)果靡羡,都需要在data中定義系洛,然后邏輯在input的輸入事件中執(zhí)行,上面定義了bindinput="handleInput"

handleInput(event){  // 輸入框輸入或改變事件
  let value = event.detail.value  // 獲取輸入框中的值
  let list = []  // 臨時(shí)變量
  this.setData({
    isShow: true  // 顯示
  })
  if(value == '') {  // 如果清空輸入框
    this.setData({
      isShow: false,  // 隱藏
      searchCitys: []  // 清空搜索結(jié)果
    })
    return   // 不再往下執(zhí)行(重要!)
  }
  for(let k in citys) {  // 進(jìn)行匹配略步,citys就是全部城市數(shù)據(jù)
    citys[k].forEach((item) => {
      if(item.spell.indexOf(value) != -1 || item.name.indexOf(value) != -1) {
        list.push(item)
      }
    })
  }
  this.setData({
    searchCitys: list  // 賦值
  })
}

這樣就實(shí)現(xiàn)了搜索框一輸入就會顯示那一層搜索結(jié)果的頁面描扯,如果清空搜索結(jié)果就會自動隱藏,同時(shí)實(shí)現(xiàn)了搜索功能與提示:


image.png

這次超人鴨是在原來的功能上提煉出這個(gè)功能來寫博文趟薄,代碼也都是盲改绽诚,邏輯是沒錯(cuò)的,但如果代碼有錯(cuò)誤或者有其他方法,歡迎指教哦憔购。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市岔帽,隨后出現(xiàn)的幾起案子玫鸟,更是在濱河造成了極大的恐慌,老刑警劉巖犀勒,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屎飘,死亡現(xiàn)場離奇詭異,居然都是意外死亡贾费,警方通過查閱死者的電腦和手機(jī)钦购,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褂萧,“玉大人押桃,你說我怎么就攤上這事〉加蹋” “怎么了唱凯?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谎痢。 經(jīng)常有香客問我磕昼,道長,這世上最難降的妖魔是什么节猿? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任票从,我火速辦了婚禮,結(jié)果婚禮上滨嘱,老公的妹妹穿的比我還像新娘峰鄙。我一直安慰自己,他們只是感情好九孩,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布先馆。 她就那樣靜靜地躺著,像睡著了一般躺彬。 火紅的嫁衣襯著肌膚如雪煤墙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天宪拥,我揣著相機(jī)與錄音仿野,去河邊找鬼。 笑死她君,一個(gè)胖子當(dāng)著我的面吹牛脚作,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼球涛,長吁一口氣:“原來是場噩夢啊……” “哼劣针!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亿扁,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤捺典,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后从祝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體襟己,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年牍陌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了擎浴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡毒涧,死狀恐怖贮预,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情链嘀,我是刑警寧澤萌狂,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站怀泊,受9級特大地震影響茫藏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霹琼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一务傲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枣申,春花似錦售葡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至模孩,卻和暖如春尖阔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背榨咐。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工介却, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人块茁。 一個(gè)月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓齿坷,卻偏偏與公主長得像桂肌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子永淌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

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

  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程崎场,因...
    小菜c閱讀 6,358評論 0 17
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,089評論 1 32
  • 6/18為愛堅(jiān)持,親子共讀day30 昨晚他讀了一面之后遂蛀,要求我讀給他聽照雁,我同意了。我讀了兩章燈塔之家系列之暴...
    曦哈小子閱讀 202評論 0 0
  • “懷采薇答恶。”音色如泠泠珠玉萍诱,溫雅而疏離悬嗓。 那男人細(xì)細(xì)咀嚼了幾秒,像是要將三個(gè)字吞咽下去似的:“相顧無相識裕坊,長歌懷采...
    笑答君莫問閱讀 387評論 0 0
  • 從量變到質(zhì)變包竹,這個(gè)引人深思的哲學(xué)話題。仔細(xì)想想籍凝,其實(shí)也與我們的生活息息相關(guān)周瞎,生活里其實(shí)也處處通透著這樣的道理。 ...
    奧里給gkd閱讀 900評論 0 0