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

首頁 > 語言 > JavaScript > 正文

react 移動(dòng)端實(shí)現(xiàn)列表左滑刪除的示例代碼

2024-05-06 15:37:12
字體:
供稿:網(wǎng)友

最近做了一個(gè)類似系統(tǒng)操作的左滑刪除的demo,用的taro框架,和大家分享一下~

首先需要考慮的有以下幾點(diǎn):

1)布局;
2)判斷是左滑還是右滑,左滑時(shí)出現(xiàn)刪除,右滑時(shí)回歸原位;
3)排他性,意思是某一個(gè)時(shí)間只能有一個(gè)項(xiàng)出現(xiàn)刪除,當(dāng)有另一個(gè)出現(xiàn)刪除時(shí),上一個(gè)自動(dòng)回歸原位。

我將列表項(xiàng)封裝成一個(gè)組件,而整個(gè)列表是另一個(gè)組件。

接下來先說列表項(xiàng)這個(gè)組件,逐一解決以上這些問題:

1)布局

我采用的是列表項(xiàng)最外層套一個(gè)盒子,這個(gè)盒子寬度設(shè)置為100vw,并且overflow:hidden。而列表項(xiàng)要包括內(nèi)容和刪除按鈕,內(nèi)容寬度為屏幕寬度,而刪除按鈕定位到右邊,所以整個(gè)列表項(xiàng)寬度是超過100vw的。描述可能沒有那么清晰,直接上代碼:

<View className='swipe-item'>  <View className='swipe-item-wrap' style={moveStyle}>   <View    className='swipe-item-left'    onTouchStart={this.handleTouchStart}    onTouchMove={this.handleTouchMove.bind(this, index)}    onTouchEnd={this.handleTouchEnd}   >    <View>{item.title}</View>   </View>   <View className='swipe-item-right'>    <View className='swipe-item-del'>del</View>   </View>  </View></View>.swipe-item { width: 100vw; overflow: hidden; line-height: 24PX; height: 24PX; text-align: center; margin-bottom: 10PX; &-wrap {  width: calc(100vw + 32PX);  height: 100%;  position: relative; } &-left {  width: 100vw; } &-right {  width: 32PX;  height: 100%;  background: pink;  position: absolute;  right: 0;  top: 0; }}

好了,布局結(jié)束之后,接下來是第二個(gè)問題:

2)判斷是左滑還是右滑,左滑時(shí)出現(xiàn)刪除,右滑時(shí)回歸原位

可以看到上面的代碼,我已經(jīng)在列表項(xiàng)左邊部分加了touch的一系列事件,下面就來分析下這幾個(gè)事件

touchstart:開始時(shí),要獲取當(dāng)前位置 touchmove:滑動(dòng)時(shí),獲取滑動(dòng)時(shí)的位置,同時(shí)縱向滑動(dòng)時(shí)阻止。來判斷當(dāng)前是左滑還是右滑,左滑時(shí)e.touches[0].pageX在減小,而右滑時(shí)變大。為了防止一個(gè)手誤操作,我加了一個(gè)判斷,當(dāng)滑動(dòng)超過一定距離時(shí)才動(dòng)。并且記錄下當(dāng)前滑動(dòng)的是第幾項(xiàng)。在render的時(shí)候給列表項(xiàng)加一個(gè)樣式就可以實(shí)現(xiàn)了,就是第一段代碼中的style。 touchend:滑動(dòng)結(jié)束

上代碼了~

 handleTouchStart = e => {   this.startX = e.touches[0].pageX  this.startY = e.touches[0].pageY } handleTouchMove (index, e) {  // 若想阻止冒泡且最外層盒子為scrollView,不可用e.stopPropogagation(),否則頁面卡死  this.currentX = e.touches[0].pageX  this.moveX = this.currentX - this.startX  this.moveY = e.touches[0].pageY - this.startY  // 縱向移動(dòng)時(shí)return  if (Math.abs(this.moveY) > Math.abs(this.moveX)) {   return  }  // 滑動(dòng)超過一定距離時(shí),才觸發(fā)  if (Math.abs(this.moveX) < 10 ) {   return  }  else {   // 否則沒有動(dòng)畫效果   this.setState({    hasTransition: true   })  }  // 通知父組件當(dāng)前滑動(dòng)的為第幾項(xiàng)  this.props.onSetCurIndex(index) } handleTouchEnd = e => {  // 結(jié)束時(shí),置為true,否則render時(shí)不生效  this.setState({   hasTransition: true  }) }            
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 揭阳市| 宜都市| 增城市| 商都县| 天门市| 奉节县| 聂拉木县| 金堂县| 白朗县| 凤台县| 阳山县| 咸宁市| 即墨市| 广昌县| 南平市| 永春县| 福建省| 嘉定区| 旺苍县| 鲁山县| 多伦县| 邵阳市| 闽清县| 东方市| 江山市| 宾川县| 望江县| 正安县| 微博| 东源县| 道真| 托克托县| 泌阳县| 隆回县| 延津县| 宁武县| 宁国市| 彩票| 汨罗市| 额济纳旗| 尼木县|