国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

vue實現城市列表選擇功能

2019-11-19 13:29:26
字體:
來源:轉載
供稿:網友

成果展示

最后的成果就是下面所展示的內容,因為gif圖沒有做,只能截圖所展示,接下來,會帶著大家一步一步的完成下面功能,腳手架搭建和node安裝在本次案例不會講解,如果了解,可以在我的博客園找到有詳細介紹

準備工作:

 引入axios插件,調用better-scroll第三方插件,本地json文件,可以參考目錄中的city.json,有條件的也可以自己去扒

功能分析

1.獲取json數據展示城市列表 。

2.側邊字母定位滾動到相應的位置。

3.實現搜索城市

接下來我們開始對組件進行劃分:本次案例中,總共劃分為五個組件,下面就是組件的劃分圖

創建city組件,通過父組件獲取數據,傳遞給子組件

<template> <div class="city">  <CityHeader></CityHeader> //頭部  <Search :list="cities"></Search> //搜索  <List :hot="hotCity" :letter="letter" :list="cities"></List> //城市列表  <Alphabet @chang="handleLetterChang" :list="cities"></Alphabet> //A-Z </div></template><script>import axios from 'axios'import CityHeader from './components/Header'import Search from './components/Search'import List from './components/List'import Alphabet from './components/Alphabet'export default { data () {  return {   cities:{}, // 城市列表   hotCity:[], //熱門城市   letter: '' // A-Z  } }, components: {  CityHeader,  Search,  List,  Alphabet }, methods:{  getCityInfo () {   axios.get('/api/city.json').then(this.getCityInfoSucc)  },  getCityInfoSucc(res){    res = res.data   if (res.ret && res.data) {    const data = res.data    this.hotCity = data.hotCities    this.cities = data.cities   }   console.log(this.cities)  },  handleLetterChang(letter) { //接受子組件傳過來的//   console.log(letter)   this.letter = letter  } }, mounted () {  this.getCityInfo () }}</script><style scoped lang="stylus"></style>

把得到的數據分次傳遞個對應的子組件,這樣有利于網站優化,不用頻繁的請數據

<template> <div class="city">  <CityHeader></CityHeader>  <Search :list="cities"></Search>  <List :hot="hotCity" :letter="letter" :list="cities"></List>  <Alphabet @chang="handleLetterChang" :list="cities"></Alphabet> </div></template>export default { data () {  return {   cities:{}, // 城市列表   hotCity:[], //熱門城市   letter: '' // A-Z  } }, components: {  CityHeader,  Search,  List,  Alphabet }, methods:{  getCityInfo () {   axios.get('/api/city.json').then(this.getCityInfoSucc) //請求本地配置的mock數據  },  getCityInfoSucc(res){    res = res.data   if (res.ret && res.data) {    const data = res.data    this.hotCity = data.hotCities    this.cities = data.cities   }  } }, mounted () {  this.getCityInfo () }}

創建頭部組件,

<template> <div class="header">  城市選擇  <router-link to="/">   <div class="iconfont back-icon"></div>  </router-link> </div></template><script>export default {}</script><style scoped lang="stylus">@import '~styles/varibles.styl';@import '~styles/mixins.styl';.header overflow: hidden height $headerHeight line-height: $headerHeight text-align: center color: #fff background: $bgColor font-size: .4rem .back-icon  position: absolute  left: 0  top: 0  width: .64rem  font-size: .4rem  text-align: center  color: #fff</style>

創建搜索組件頁面,接受父組件傳遞的數據,引入better-scroll第三方插件,實現列表滾動

<template> <div>  <div class="search">   <input v-model="keyword" class="search-input" type="text" placeholder="輸入城市名或者拼音" />  </div>  <div class="search-content" ref="search" v-show="keyword">   <ul>    <li class="serach-item border-bottom" v-for="item in listItem" :key="item.id">{{item.name}}</li>    <li v-show="hasNoData" class="serach-item border-bottom">沒有搜索到匹配的數據</li>   </ul>  </div> </div></template><script>import BScroll from 'better-scroll'export default { props: {   list: Object, }, data() {  return {   keyword:'',   listItem:[],   timer:null  } }, computed: {  hasNoData() {   return !this.listItem.length //沒有搜索的條件是否顯示  } }, watch: {  keyword () {   if (this.timer) {    clearTimeout(this.timer)   }   if(!this.keyword) { //清空    this.listItem = ""    return   }   this.timer = setTimeout(() => {    const result = []    for (let i in this.list) {     this.list[i].forEach((value) => { //匹配搜索的條件      if (value.spell.indexOf(this.keyword) > -1 || value.name.indexOf(this.keyword) > -1) {       result.push(value)      }     })    }    this.listItem= result   },100)  } }, mounted () {  this.scroll = new BScroll(this.$refs.search) }}</script><style scoped lang="stylus">@import '~styles/varibles.styl'@import '~styles/mixins.styl'.search height: .72rem padding: 0 .1rem background:$bgColor .search-input  box-sizing: border-box  width:100%  height: .62rem  line-height: .62rem  text-align: center  border-radius: .06rem  padding: 0 .1rem  color: #666.search-content  z-index: 1 overflow:hidden position:absolute top: 1.58rem left: 0 right: 0 bottom: 0 background: #eee .serach-item  line-height: .62rem  padding-left:.2rem  color:#666  background: #fff</style>

創建城市列表組件,引入better-scroll插件,實現列表滾動,通過watch監聽letter,實現字母與城市列表滾動

<template> <div class="list" ref="wrapper">  <div>   <div class="area">    <div class="title border-topbottom">當前城市</div>    <div class="button-list">     <div class="button-wrapper">      <div class="button">鄭州</div>     </div>    </div>   </div>   <div class="area">    <div class="title border-topbottom">熱門城市</div>    <div class="button-list">     <div class="button-wrapper" v-for="item in hot" :key="item.id">      <div class="button">{{item.name}}</div>     </div>    </div>   </div>   <div class="area"     v-for="(item,key) in list"     :ref="key"    :key="key">    <div class="title border-topbottom">{{key}}</div>    <ul class="item-list">     <li class="item border-bottom"       v-for="listInner in item"       :key="listInner.id"     >{{listInner.name}}</li>    </ul>   </div>  </div> </div></template><script>import BScroll from 'better-scroll'export default { props: {   hot: Array,   list: Object,   letter:String  }, mounted () {  this.scroll = new BScroll(this.$refs.wrapper) }, watch:{  letter () { //監聽列表滾動事件 A-Z   if(this.letter) {    const element = this.$refs[this.letter][0]    this.scroll.scrollToElement(element)   }  } }}</script><style scoped lang="stylus">@import '~styles/varibles.styl';@import '~styles/mixins.styl';.border-topbottom &:before  background: #ccc &:after  background:#ccc.border-bottom &:before  background: #ccc.list overflow: hidden position:absolute top:1.58rem left:0 right:0 bottom:0 .title  line-height: .54rem;  background: #eee;  padding-left: .2rem;  color: #666;  font-size: .26rem; .button-list  overflow:hidden  padding: .1rem .6rem .1rem .1rem  .button-wrapper   float:left   width:33.33%   .button    margin: .1rem    padding: .1rem 0    text-align: center    border: .02rem solid #ccc    border-radius: .06rem .item-list  .item   line-height: .76rem   color:#212121   padding-left: .2rem   font-size: .28rem   text-overflow: ellipsis   white-space: nowrap</style>

創建字母組件,點擊字母,左邊列表城市想對應,通過this.$emit事件,子組件在觸發的事件傳遞給父組件,父組件通過子組件傳遞的事件,在傳遞給List組件,

<template> <div class="list">  <li class="item"   :ref="item"    @click="handeClick"     @touchstart="handleTouchStart"     @touchmove="handleTouchMove"     @touchend= "handleTouchEnd"    v-for="item of letter"     :key="item">{{item}}</li> </div></template><script>export default { props: {   list: Object }, data () {  return {   touchstart:false,   startY:0,   timer: null  } }, updated () {  this.startY = this.$refs['A'][0].offsetTop }, computed: {  letter () {   const letter =[]   for (let i in this.list) { //循環A-Z    letter.push(i)   }   return letter  } }, methods: {  handeClick(e) {   this.$emit('chang',e.target.innerText) //傳給父組件City  },  handleTouchStart () {   // 手指放上   this.touchstart = true  },  handleTouchMove (e) {   // 手指移動   if(this.touchstart) {    if(this.timer) {     clearInterval(this.timer)    }    this.timer = setTimeout(() => {     const touchY = e.touches[0].clientY -79 //到藍色頭部的距離     const index = Math.floor((touchY - this.startY ) / 20)     if(index >=0 && index < this.letter.length) {      this.$emit('chang',this.letter[index])     }    },16)   }  },  handleTouchEnd () {   // 手指離開   this.touchstart = false  } }}</script><style scoped lang="stylus">@import '~styles/varibles.styl';@import '~styles/mixins.styl';.list display: flex flex-direction:column justify-content: center position:absolute top: 1.58rem right: 0 bottom: 0 width: .4rem .item  line-height:.44rem  text-align: center  color: $bgColor  list-style:none</style>

總結

以上所述是小編給大家介紹的vue實現城市列表選擇功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 全椒县| 湖南省| 鹤峰县| 边坝县| 祁门县| 威海市| 呼伦贝尔市| 漾濞| 新邵县| 塘沽区| 阿鲁科尔沁旗| 延边| 扬中市| 项城市| 四子王旗| 方城县| 周口市| 钟山县| 娱乐| 泾川县| 高邑县| 卢氏县| 班玛县| 旌德县| 满洲里市| 从江县| 灵丘县| 武鸣县| 朝阳区| 沽源县| 松江区| 宜章县| 天门市| 建德市| 齐齐哈尔市| 上饶县| 平顺县| 武汉市| 怀安县| 刚察县| 密云县|