城市列表頁面

頁面包括三個(gè)部分,當(dāng)前城市宙址,熱門城市和城市滾動(dòng)欄轴脐。城市的信息都是通過axios請(qǐng)求json文件再渲染的。滾動(dòng)部分和字母表部分用到了一個(gè)插件抡砂,這部分也是我感覺最困難的地方大咱。


城市滾動(dòng)展示.gif

1.axios請(qǐng)求數(shù)據(jù)

跟之前一樣,在city.vue里發(fā)送總請(qǐng)求舀患,得到的數(shù)據(jù)可以傳給子組件徽级,避免了每個(gè)組件都要發(fā)送請(qǐng)求,減少請(qǐng)求數(shù)量聊浅。
mounted鉤子在掛載好后自動(dòng)調(diào)用函數(shù)getCityInfo(),成功后調(diào)用函數(shù)handleGetCityInfoSucc餐抢,函數(shù)接收res參數(shù),一開始我還不太明白這段代碼意思低匙,后來在控制臺(tái)輸出了一下res就明白了旷痕。

      getCityInfo(){
            axios.get('/api/city.json')
            .then(this.handleGetCityInfoSucc)
        },
        handleGetCityInfoSucc(res){
            res=res.data
            if(res.ret && res.data){
                const data=res.data
                this.cities=data.cities
                this.hotCities=data.hotCities
            }
        },

看一下控制臺(tái)中res輸出:

res數(shù)據(jù)顯示.png

首先res=res.data 將res指向res.data部分,此時(shí)的res包括data顽冶、ret和--proto--三部分欺抗,如果res.ret==true并且res.data不為空,將data指向res中的data部分强重。同樣獲取到data中的cities和hotCities部分绞呈。

2.父子組件數(shù)據(jù)傳遞

給子組件綁定屬性,子組件通過props接收 间景,懂自懂佃声,不多說=。=
有一個(gè)地方需要注意 Cities是對(duì)象 hotCities是數(shù)組倘要,在列表渲染的時(shí)候圾亏,對(duì)于數(shù)組可以(item,index)這樣取屬性,對(duì)于對(duì)象需要(item,key)取屬性,key代表“A志鹃、B夭问、C...”等地區(qū)首字母,對(duì)象啊 是以鍵值對(duì)存儲(chǔ)的

<div class="area" 
   v-for="(item,key) of cities" 
   :key="key" :ref="key">
   <div class="title border-top-bottom">{{key}}</div>
......

3. 組件數(shù)據(jù)傳遞——字母列表部分【難點(diǎn)-邏輯比較繞】

3.1 點(diǎn)擊字母列表中字母曹铃,列表滾動(dòng)到相應(yīng)位置

先搞清楚缰趋,Alphabet.vue和 List.vue是兄弟組件關(guān)系,都屬于City.vue的子組件铛只。
要完成點(diǎn)擊字母表埠胖,列表跟著滾動(dòng)的功能糠溜,需要組件之間通信淳玩。
在父組件City中定義的數(shù)據(jù)有cities hotCities和letter,前兩個(gè)數(shù)據(jù)都通過axios獲取到了非竿,而letter在這里定義蜕着,通過Alphabet接收,傳給List使用红柱。

data(){
        return {
            cities:{},
            hotCities:[],
            letter:''
        }
    },

Alphabet組件給字母表中每個(gè)字母都綁定了一個(gè)點(diǎn)擊事件@click="handleLetterClick"承匣。當(dāng)點(diǎn)擊li,通過$emit向外發(fā)送該字母到父組件锤悄,實(shí)現(xiàn)子組件向父組件傳遞數(shù)據(jù)韧骗。

  handleLetterClick(e){
        this.$emit('change',e.target.innerText)
      },

父組件通過 @change="handleLetterChange">事件接收,在函數(shù)里接收到點(diǎn)擊的字母零聚,賦值給letter

handleLetterChange(letter){
      this.letter=letter
  }

父組件得到letter后袍暴,傳給List,List里定義一個(gè)watch函數(shù)隶症,隨時(shí)監(jiān)聽letter的變化政模,當(dāng)letter非空時(shí),使用better-scroll將列表滾動(dòng)到相應(yīng)的位置

 letter() {
     // 如果字符非空蚂会,會(huì)自動(dòng)滾到字符開頭的位置
      if(this.letter){
      // better-scroll參數(shù)需要使用dom  
      const element=this.$refs[this.letter][0] //dom形式
      this.scroll.scrollToElement(element)
    }
 }

剛開始覺得有點(diǎn)復(fù)雜淋样,但是多想幾遍流程就想清楚了


數(shù)據(jù)傳遞過程圖.png
3.2 滑動(dòng)字母列表中字母,列表滾動(dòng)到相應(yīng)位置

在Alphabet組件中綁定幾個(gè)函數(shù) 胁住,在move中先計(jì)算A到頂部的距離趁猴,再計(jì)算手指點(diǎn)到頂部距離,相減得到與A的相對(duì)距離彪见,除以每個(gè)li的高度儡司,得到index,發(fā)送letters[index]到change事件企巢。

        @touchstart="handleTouchStart"
        @touchmove="handleTouchMove"
        @touchend="handleTouchEnd"
        @click="handleLetterClick">
handleTouchMove(e){
        // 當(dāng)狀態(tài)等于true時(shí)才對(duì)執(zhí)行move事件
        if(this.touchStatus){
          const startY=this.$refs["A"][0].offsetTop //dom元素
          const touchY= e.touches[0].clientY-80
          const index=Math.floor((touchY-startY)/20)
          if(index >= 0 && index < this.letters.length){
            this.$emit("change",this.letters[index])
          }
        }
3.3 offsetTop和ClientY區(qū)別 以及其他滾動(dòng)代碼的常用屬性

【坑 等填】

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末枫慷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌或听,老刑警劉巖探孝,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異誉裆,居然都是意外死亡顿颅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門足丢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粱腻,“玉大人,你說我怎么就攤上這事斩跌∩苄” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵耀鸦,是天一觀的道長(zhǎng)柬批。 經(jīng)常有香客問我,道長(zhǎng)袖订,這世上最難降的妖魔是什么氮帐? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮洛姑,結(jié)果婚禮上上沐,老公的妹妹穿的比我還像新娘。我一直安慰自己楞艾,他們只是感情好参咙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著产徊,像睡著了一般昂勒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舟铜,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天戈盈,我揣著相機(jī)與錄音,去河邊找鬼谆刨。 笑死塘娶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痊夭。 我是一名探鬼主播刁岸,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼她我!你這毒婦竟也來了虹曙?” 一聲冷哼從身側(cè)響起迫横,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酝碳,沒想到半個(gè)月后矾踱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疏哗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年呛讲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片返奉。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贝搁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芽偏,到底是詐尸還是另有隱情雷逆,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布哮针,位于F島的核電站关面,受9級(jí)特大地震影響坦袍,放射性物質(zhì)發(fā)生泄漏十厢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一捂齐、第九天 我趴在偏房一處隱蔽的房頂上張望蛮放。 院中可真熱鬧,春花似錦奠宜、人聲如沸包颁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娩嚼。三九已至,卻和暖如春滴肿,著一層夾襖步出監(jiān)牢的瞬間岳悟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工泼差, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贵少,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓堆缘,卻偏偏與公主長(zhǎng)得像滔灶,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吼肥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354