1.上一章--Home.vue及vue-resource使用
2.cangdu大神的項目源碼地址--Github地址
3.接口地址--Github地址
4.UI框架用的是--Mint UI
5.下一章--登陸註冊頁面及密碼的暗明文轉換css
1.先看看Home.vue代碼html
<template> <div> <mt-header fixed> <span slot="left">elm</span> <mt-button slot="right">登陸|</mt-button> <mt-button slot="right">註冊</mt-button> </mt-header> <div class="padtop40"> <div class="after ih50 padlr10 box bgfff"> <span class="">當前選擇城市</span> <span class="right fs0-8 col9f">定位不許時,請在城市列表選擇</span> </div> <mt-cell title="天津" class="col after" to="" is-link value=""></mt-cell> <div class="mgtop10 bgfff"> <mt-cell class="after" title="熱門城市"></mt-cell> <div class="itembox ovhid col"> <div>天津</div><div>天津</div><div>天津</div><div>天津</div> <div>天津</div><div>天津</div><div>天津</div><div>天津</div> <div>天津</div><div>天津</div><div>天津</div><div>天津</div> </div> </div> <div class="mgtop10 bgfff"> <mt-cell class="after" title="A"></mt-cell> <div class="itembox ovhid"> <div>天津</div><div>天津</div><div>天津</div><div>天津</div> <div>天津</div><div>天津</div><div>天津</div><div>天津</div> <div>天津</div><div>天津</div> </div> </div> </div> </div> </template> <script> export default { data () { return { } }, component:{ //註冊組件 }, mounted:function(){ //生命週期 this.$http.get('http://cangdu.org:8001/v1/cities?type=group').then(response => { console.log(response); }, response => { console.log(response); }); }, computed:{ //計算屬性 }, methods:{ //函數 } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped> .itembox>div{ width:25%; float:left; text-align:center; height:40px; line-height:40px; box-sizing: border-box; border-right:1px solid #e4e4e4; border-bottom:1px solid #e4e4e4; } .itembox>div:nth-child(4n){ border-right:0px; } </style>
效果以下vue
2.賦值node
首先咱們要把城市列表的信息先賦值給一個變量,這樣咱們就能夠調用了嘛。git
3.v-for
城市列表咱們有了,可是咱們怎麼把它顯示到頁面呢?難道要用for
循環拼接字符串插到頁裏麼?NONONO,那仍是操做DOM節點,而VUE的好處之一就是操做數據來控制DOM。循環VUE用的是v-for,home.vue
的html部分代碼修改以下github
<template> <div> <mt-header fixed> <span slot="left">elm</span> <mt-button slot="right">登陸|</mt-button> <mt-button slot="right">註冊</mt-button> </mt-header> <div class="padtop40"> <div class="after ih50 padlr10 box bgfff"> <span class="">當前選擇城市</span> <span class="right fs0-8 col9f">定位不許時,請在城市列表選擇</span> </div> <mt-cell title="天津" class="col after" to="" is-link value=""></mt-cell> <div class="mgtop10 bgfff"> <mt-cell class="after" title="熱門城市"></mt-cell> <div class="itembox ovhid col"> <div>天津</div><div>天津</div><div>天津</div><div>天津</div> <div>天津</div><div>天津</div><div>天津</div><div>天津</div> <div>天津</div><div>天津</div><div>天津</div><div>天津</div> </div> </div> <div v-for="(items,index) in citylist" class="mgtop10 bgfff"> <mt-cell class="after" :title="index"></mt-cell> <div class="itembox ovhid"> <div v-for="item in items">{{item.name}}</div> </div> </div> </div> </div> </template>
其實只是把所有城市列表的代碼修改以下segmentfault
<div v-for="(items,index) in citylist" class="mgtop10 bgfff"> <mt-cell class="after" :title="index"></mt-cell> <div class="itembox ovhid"> <div v-for="item in items">{{item.name}}</div> </div> </div>
修改第一段代碼v-for="(items,index) in citylist"
citylist
是一個object
對象(也能夠是數組),items
是citylist
的每一項鍵值,index
是items
的鍵名(若爲數組則是1,2,3...遞增)。citylist
有多少項,就會循環多少次,就會產生多少個元素(該元素爲 v-for 寫在的那個元素,其內的子元素也會自動生成)。而後就能夠用item
在元素中當作鍵值來使用。api
修改第二段代碼:title="index"
由於我們獲取的數據的鍵名就是A,B,C,D...因此我們的城市列表直接用index
來排序。而:title="index"
是 v-bind:title="index"
的縮寫。vue的命令都用v-
來開頭。v-bind用來綁定DOM屬性。數組
修改第三段代碼<div v-for="item in items">{{item.name}}</div>
老鐵們要注意,若items
是A開頭的城市數組集合,而item
是items
的 每一項,即一個具體的城市(這只是舉一個例子)框架
ok,代碼我們先寫這麼多,來看看頁面變化。
所有出現!!老鐵們能夠看到,我們只須要寫一個模板,vue會幫咱們自動生成全部的數據。可是還有幾個問題須要處理一下
1.數據的順序並非從A挨個排到Z;
2.有的城市名字太長出現重疊。
4.排序
思路:從新建立一個object,鍵名是從A到Z,鍵值就是獲取的數據的鍵值。
計算函數:js寫在哪?一種方法是寫在生命週期mounted
的數據請求裏,直接返回一個處理好的citylist
,但我們用另外一種方法--計算屬性computed。home.vue
部分是代碼修改以下
computed:{ //計算屬性 getlist:function(){ var mycitylist={}; for(var i=65;i<=90;i++){ var num= String.fromCharCode(i); mycitylist[num]=this.citylist[num]; } return mycitylist } },
fromCharCode()
是把ascii碼轉成字符,因此num
就是A,B,C,D...當咱們調用getlist函數時,獲得的是mycitylist
(當citylist
改變時,無需從新調用,mycitylist
會隨之改變)
函數寫好了在哪調用呢?
<div v-for="(items,index) in getlist" class="mgtop10 bgfff"> <mt-cell class="after" :title="index"></mt-cell> <div class="itembox ovhid"> <div v-for="item in items">{{item.name}}</div> </div> </div>
只是把<template></template>
中的citylist
替換成getlist
便可。
看看頁面結果
解決!城市已經按照A-Z排列,只剩下名字長度問題了,設置爲單行不換行超出省略號便可,在src下的style下的mycss.css
添加
.nowarp{ white-space:nowrap; /* 不換行 */ overflow:hidden; /* 內容超出寬度時隱藏超出部分的內容 */ text-overflow:ellipsis; /* 當對象內文本溢出時顯示省略標記(...) ;需與overflow:hidden;一塊兒使用。*/ }
把nowarp
這個class加到城市名字的div
上便可
解決。這麼看城市列表是沒有問題了,那我們接下來請求熱門城市和當前城市。home.vue
修改以下
<template> <div> <mt-header fixed> <span slot="left">elm</span> <mt-button slot="right">登陸|</mt-button> <mt-button slot="right">註冊</mt-button> </mt-header> <div class="padtop40"> <div class="after ih50 padlr10 box bgfff"> <span class="">當前選擇城市</span> <span class="right fs0-8 col9f">定位不許時,請在城市列表選擇</span> </div> <mt-cell :title="nowcity.name" class="col after" to="" is-link value=""></mt-cell> <div class="mgtop10 bgfff"> <mt-cell class="after" title="熱門城市"></mt-cell> <div class="itembox ovhid col"> <div v-for="item in hotcity">{{item.name}}</div> </div> </div> <div v-for="(items,index) in getlist" class="mgtop10 bgfff"> <mt-cell class="after" :title="index"></mt-cell> <div class="itembox ovhid"> <div class="nowarp" v-for="item in items">{{item.name}}</div> </div> </div> </div> </div> </template> <script> export default { data () { return { citylist:"", hotcity:"", nowcity:"" } }, component:{ //註冊組件 }, mounted:function(){ //生命週期 //城市列表 this.$http.get('http://cangdu.org:8001/v1/cities?type=group').then(response => { console.log(response); this.citylist=response.body; }, response => { console.log(response); }); //熱門城市 this.$http.get('http://cangdu.org:8001/v1/cities?type=hot').then(response => { console.log(response); this.hotcity=response.body; }, response => { console.log(response); }); //定位城市 this.$http.get('http://cangdu.org:8001/v1/cities?type=guess').then(response => { console.log(response); this.nowcity=response.body; }, response => { console.log(response); }); }, computed:{ //計算屬性 getlist:function(){ var mycitylist={}; for(var i=65;i<=90;i++){ var num= String.fromCharCode(i); mycitylist[num]=this.citylist[num]; } return mycitylist } }, methods:{ //函數 } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped> .itembox>div{ width:25%; float:left; text-align:center; height:40px; line-height:40px; box-sizing: border-box; border-right:1px solid #e4e4e4; border-bottom:1px solid #e4e4e4; } .itembox>div:nth-child(4n){ border-right:0px; } </style>
頁面結果以下
搞定!home.vue
大體寫完了,剩下就是交互了