亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

小程序自定義組件實現城市選擇功能

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

上篇文章有介紹一些小程序的自定義組件語法,這篇文章就不多做贅述,重點介紹組件的實現邏輯。

先把效果圖貼出來,看看要實現的效果:

城市選擇效果圖.gif

首先還是設置布局,從實現效果看,組件可分成三個部分:展示城市數據的二級列表、側邊的滑動欄以及中間的提示框。也就是一個scroll-view,一個view布局以及一個text。最終確定的wxml布局文件如下:

<scroll-view class='cityList' scroll-y scroll-into-view='{{currentIndex}}' scroll-top='{{scrollTop}}'>   <view wx:for='{{allCities}}'>     <view class='letter-class' id="id{{index}}">{{item.letter}}</view>     <view class='item-class' wx:for='{{item.cityList}}' wx:for-item='cityItem' bindtap='citySelectEvent' data-city='{{cityItem.name}}' data-letter='{{cityItem.key}}'>{{cityItem.name}}</view>   </view></scroll-view> <view class='citySlide' catchtouchstart='slideStart' catchtouchmove='slideMove' catchtouchend='slideEnd'>   <view class='citySlideItem' wx:for='{{allCities}}' data-index='{{index}}'>{{item.letter}}</view></view> <text class='letterText' hidden='{{isLetterHidden}}' style='top:{{letterTop}}px;left:{{letterLeft}}px'>{{letterText}}</text>

布局文件有了,我們就需要考慮該如何實現側邊欄與二級列表的聯動效果了。這里我利用的是scroll-view的scroll-into-view屬性,這個屬性能讓scroll-view滑動到對應id的view的位置,很符合我們的需求。

scroll-into-view屬性.png

這里我們為列表的第一級布局view設置id,并為scroll-view設置scroll-into-view屬性

<scroll-view class='cityList' scroll-y scroll-into-view='{{currentIndex}}' scroll-top='{{scrollTop}}'>  .  .  .//id不能以數字開頭<view class='letter-class' id="id{{index}}">{{item.letter}}</view>

然后在.js中的data中初始化currentIndex為'id0'

/**   * 組件的初始數據   */   data: {     currentIndex: 'id0'   }

現在的問題就是如何計算出手指在側邊欄上觸摸的是第幾個letter,然后通過改變currentIndex的值,使scroll-view滑動到指定位置來達到聯動的效果。

下面說下思路

首先確認側邊欄的高度,我是以屏幕高度減去80px作為側邊欄高度,在.wxss文件中通過樣式設置。

.citySlide {   display: flex;   flex-direction: column;   width: 60rpx;   height: calc(100% - 80px);   position: absolute;   top: 40px;   right: 16rpx;   align-items: center;   justify-content: center;   background-color: #ccc;   opacity: 0.6;}

然后在.js中通過把屏幕高度減去80px計算出側邊欄的具體高度。再除以數據源的一級數據數組長度,計算出每個letter的高度。

 wx.getSystemInfo({        success: function (res) {          letterLineHeight = (res.windowHeight - 80) / that.data.allCities.length;          that.setData({             letterTop: res.windowHeight / 2 - 30,             letterLeft: res.windowWidth / 2 - 30          });        }     })

計算出每個letter的高度后,我們就可以在側邊欄的觸摸監聽事件中,通過觸摸的點的坐標位置,來計算出當前觸摸的letter的序號index,然后再動態修改currentIndex的值為('id'+index)。就可以達到聯動的效果了。

顯示在屏幕中央的提示框的實現則比較簡單,通過一個變量isLetterHidden控制text的顯示與隱藏就可以輕松實現。

slideStart: function (e) {  //手指觸摸的y坐標值  var touchY = e.touches[0].clientY;  //布局距離屏幕頂端距離  var offsetTop = e.currentTarget.offsetTop;  var index = parseInt((touchY - offsetTop) / letterLineHeight);  this.setData({    currentIndex: 'id' + index,    isLetterHidden: false,    letterText: this.data.allCities[index].letter  });}, slideMove: function (e) {  var touchY = e.touches[0].clientY;  var offsetTop = e.currentTarget.offsetTop;  var index = parseInt((touchY - offsetTop) / letterLineHeight);  this.setData({    currentIndex: 'id' + index,    isLetterHidden: false,    letterText: this.data.allCities[index].letter  });}, slideEnd: function (e) {  var that = this;  wx: setTimeout(function () {    that.setData({       isLetterHidden: true    });  }, 200);}

這里有一點要注意,設置側邊欄觸摸事件的時候,要選擇catchtouchxxxx事件,不能使用bindtouchxxxx,因為bind事件不會阻止事件冒泡,這樣手指在側邊欄滑動時,會影響到下方的列表的滑動,而catch事件阻止了事件冒泡,就不會出現滑動影響的問題。

再說下城市的數據源格式要求,要求是一個二維數組,然后子項要有name和key兩個字段,分別代表城市名和類別letter。

數據源格式.png

項目GitHub地址:TemplateOfHotel

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色综合视频一区中文字幕| 欧美裸体xxxx极品少妇| 黄网站色欧美视频| 久久久久这里只有精品| 日韩一区视频在线| 国产亚洲日本欧美韩国| 国产做受69高潮| 亚洲自拍欧美另类| 国产专区欧美专区| 777777777亚洲妇女| 亚洲欧美三级伦理| 九色精品免费永久在线| 亚洲xxxxx性| 91精品免费久久久久久久久| 国产91av在线| 久久免费视频在线| 精品视频在线播放| 国产精品美女999| 国产精品久久精品| 国产不卡av在线免费观看| 欧美成人剧情片在线观看| 九九热在线精品视频| 日本一区二区在线播放| 色哟哟亚洲精品一区二区| 精品性高朝久久久久久久| 欧美视频专区一二在线观看| 久久国产精品99国产精| 欧美性猛交丰臀xxxxx网站| 欧美巨猛xxxx猛交黑人97人| 好吊成人免视频| 亚洲激情视频在线播放| 2025国产精品视频| 欧美综合一区第一页| 国产精品美女呻吟| 91视频免费网站| 国产日韩视频在线观看| 国产精品欧美日韩| 亚洲精品wwww| 色综合天天综合网国产成人网| 日韩欧美高清在线视频| 国产精品偷伦视频免费观看国产| 国产精品一区二区3区| 精品久久久免费| 国产精品一区二区三区成人| 亚洲大胆人体在线| 国产一区二区三区三区在线观看| 国产精品美女久久久久av超清| 欧美日韩在线观看视频| 日韩久久午夜影院| 欧美激情按摩在线| 亚洲香蕉成人av网站在线观看| 91国产精品91| 亚洲视频一区二区三区| 亚洲第一区在线观看| 日韩最新在线视频| 欧美黄色片在线观看| 日韩最新av在线| 欧美精品一区三区| 国产在线精品成人一区二区三区| 日韩在线欧美在线国产在线| 57pao成人永久免费视频| 久久久av电影| 狠狠躁夜夜躁久久躁别揉| 久久全国免费视频| 亚洲色图15p| 538国产精品一区二区免费视频| 中文字幕在线观看日韩| 成人福利视频在线观看| 国产精品福利网站| 欧美裸体xxxx极品少妇| 这里只有精品视频| 91久久久久久久久久久久久| 欧美日韩国产一中文字不卡| 日韩精品中文字幕在线播放| 奇米一区二区三区四区久久| 欧美激情三级免费| 欧美成人免费在线视频| 欧美电影在线观看| 在线观看国产成人av片| 欧美日韩亚洲91| 国产亚洲人成a一在线v站| 久久亚洲精品网站| 亚洲激情视频网| 国产欧美亚洲视频| 日韩在线观看精品| 欧美一区二区三区四区在线| 一区二区三区日韩在线| 亚洲成在人线av| 亚洲视频在线观看| 中文字幕亚洲欧美日韩在线不卡| 欧美日韩在线观看视频| 成人av.网址在线网站| 欧美成年人网站| 国产亚洲一区二区在线| 欧美国产日韩一区| 亚洲第一男人av| 久久伊人91精品综合网站| 日韩一区二区福利| 国产97在线播放| 亚洲毛片在线观看.| 亚洲精品日韩激情在线电影| 97色在线观看免费视频| 91亚洲国产成人久久精品网站| 羞羞色国产精品| 亚洲精品视频二区| 日韩av网站导航| 日韩毛片在线看| 欧美中文字幕精品| 亚洲精品久久久久| 亚洲高清色综合| 黑人巨大精品欧美一区免费视频| 亚洲国产欧美一区二区丝袜黑人| 久久久久久九九九| 456亚洲影院| 亚洲最大av网| 久国内精品在线| 国产精品九九久久久久久久| 日韩免费黄色av| 2024亚洲男人天堂| 九九精品在线视频| 亚洲精品美女在线| 久热精品视频在线观看一区| 亚洲精品美女在线观看| 欧美亚洲国产视频小说| 久久久久久久久亚洲| 国产做受高潮69| 91av中文字幕| 日韩极品精品视频免费观看| 成人国产精品一区二区| 国产精品人人做人人爽| 国产噜噜噜噜噜久久久久久久久| 国产精品国产三级国产aⅴ浪潮| 亚洲国产另类 国产精品国产免费| 欧美黑人一级爽快片淫片高清| 亚洲精品suv精品一区二区| 欧美一级大胆视频| 欧美片一区二区三区| 成人黄色免费片| 精品国产一区二区三区久久久狼| 日韩电影中文 亚洲精品乱码| 国产精品久久久久久婷婷天堂| 日本精品va在线观看| 成人激情视频网| 中文字幕亚洲自拍| 亚洲午夜性刺激影院| 欧美大片免费观看在线观看网站推荐| 国产亚洲激情视频在线| 在线电影av不卡网址| 国产成人激情小视频| 欧美最顶级的aⅴ艳星| 成人在线视频网站| 这里精品视频免费| 亚洲aⅴ男人的天堂在线观看| 亚洲一区二区三| 日韩在线视频免费观看| 欧美精品免费看| 国语自产偷拍精品视频偷| 久久久久久国产精品三级玉女聊斋| 亚洲а∨天堂久久精品9966| 成人中文字幕+乱码+中文字幕| 亚洲v日韩v综合v精品v| 国产精品18久久久久久首页狼| 97成人超碰免| 日韩欧美中文字幕在线观看|