微信小程序之列表左滑刪除功能

介紹

  • 第一次寫小程序伐脖,記錄一下遇到的需求以及解決方法热幔。可能功能不是很難讼庇,主要是做下記錄绎巨。為以后遇到相同的需求做鋪墊。

什么是左滑刪除

  • 用過QQ的人都知道蠕啄,消息列表內(nèi)场勤,左滑單個聊天可以刪除、置頂?shù)牟僮骷吒τ谝苿佣苏〉钠聊粊碚f和媳,這種交互可以說是非常的節(jié)省地方。故受到了眾多產(chǎn)品狗的喜愛哈街。
image

實現(xiàn)原理

  • 最外層一個view水平方向排列留瞳,里面包含一個內(nèi)容區(qū)view,一個操作區(qū)view
  • 讓你要展示的布局充滿屏幕,通過css樣式讓超出的刪除按鈕隱藏
  • 監(jiān)聽touch事件骚秦,平移布局顯示和隱藏刪除按鈕(列表每一項中有一個isTouchMove屬性她倘,通過監(jiān)聽touch改變該屬性給列表不同的樣式將隱藏的按鈕顯示出來)
image

直接上代碼

  • wxml
<view class="list-page">
  <view class="list-item {{user.isTouchMove?'list-item-touch-active':''}}" wx:for="{{list}}" wx:for-item="user" wx:for-index="index" wx:key="user.id" bindtouchstart="touchstart" bindtouchmove="touchmove" data-id="{{user.id}}">

    <view class="item-content">
      <view class="content-name">{{user.name}}</view>
      <view class="content-info"> 
        <text>{{user.phone}}</text>
        <text>{{user.sex}}</text>
      </view>
    </view>

    <view class="item-delete">刪除</view>
  </view>
</view>

  • wxss
.list-page{
  display: flex;
  flex-direction: column;
  border-top: 2rpx solid #f0f0f0
}
.list-item{
  height: 160rpx;
  width: 100%;
  display: flex;
  justify-content: space-between;
  align-items: center;
  border-bottom: 2rpx solid #f0f0f0;
}
.item-content{
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 0 20rpx 0 20rpx;
  -webkit-transition: all 0.4s;
  transition: all 0.4s;
  -webkit-transform: translateX(180rpx);
  transform: translateX(180rpx); 
  margin-left: -200rpx;
}
.content-info{
  display: flex;
  width: 100%;
  justify-content: space-between;
  font-size: 32rpx;
  color: #999
}
.content-name{
  width: 100%;
}
.list-item-touch-active .item-content{
  margin-left: -100rpx;
}
.list-item-touch-active .item-content, .list-item-touch-active .item-delete {
  -webkit-transform: translateX(0) !important;
  transform: translateX(0) !important;
}
.item-delete{
  width: 100rpx;
  height: 160rpx;
  display: flex;
  justify-content: center;
  align-items: center;
  background: red;
  color: #fff;
  font-size: 32rpx;
  -webkit-transform: translateX(180rpx);
  transform: translateX(180rpx);
  -webkit-transition: all 0.4s;
  transition: all 0.4s;
}
  • js
// pages/list/list.js
const App = getApp()
Page({

  /**
   * 頁面的初始數(shù)據(jù)
   */
  data: {
    list:[
      {
        id:1,
        name:'張三',
        phone:'15955040222',
        sex:'男',
        isTouchMove:false,
      },
      {
        id: 2,
        name: '張三',
        phone: '15955040222',
        sex: '男',
        isTouchMove: false,
      },
      {
        id: 3,
        name: '張三',
        phone: '15955040222',
        sex: '男',
        isTouchMove: false,
      },
      {
        id: 4,
        name: '張三',
        phone: '15955040222',
        sex: '男',
        isTouchMove: false,
      },
      {
        id: 5,
        name: '張三',
        phone: '15955040222',
        sex: '男',
        isTouchMove: false,
      },
      {
        id: 6,
        name: '張三',
        phone: '15955040222',
        sex: '男',
        isTouchMove: false,
      },
      {
        id: 7,
        name: '張三',
        phone: '15955040222',
        sex: '男',
        isTouchMove: false,
      },
    ]
  },
  touchstart: function (e) {
    //開始觸摸時 重置所有刪除
    let data = App.touch._touchstart(e, this.data.list) //將修改過的list setData
    this.setData({
      list: data
    })
  },

  //滑動事件處理
  touchmove: function (e) {
    let data = App.touch._touchmove(e, this.data.list,'id')//將修改過的list setData
    this.setData({
      list: data
    })
  },
})
  • 對于滑動事件的處理專門封裝了一個.js文件,防止以后還會用到作箍。
var startX
var startY
class touch {

  constructor() {
  }

  _touchstart(e, items) {
    //開始觸摸時 重置所有刪除
    items.forEach(function (v, i) {
      if (v.isTouchMove) //只操作為true的
        v.isTouchMove = false;
    })

    startX = e.changedTouches[0].clientX
    startY = e.changedTouches[0].clientY

    return items
  }

  _touchmove(e, items,key) {
      const id = e.currentTarget.dataset.id, //獲取列表中每一項的唯一值硬梁,可以取id
      touchMoveX = e.changedTouches[0].clientX, //滑動變化坐標
      touchMoveY = e.changedTouches[0].clientY, //滑動變化坐標
      //獲取滑動角度
      angle = this._angle({
        X: startX,
        Y: startY
      }, {
          X: touchMoveX,
          Y: touchMoveY
        });
    items.forEach(function (v, i) {
      v.isTouchMove = false
      //滑動超過30度角 return
      if (Math.abs(angle) > 30) return;
      if (v[key] == id) { //判斷滑動的id與列表中的id是否一致,如果是的話胞得,改變滑動這一項的isTouchMove屬性
        if (touchMoveX > startX) //右滑
          v.isTouchMove = false
        else //左滑
          v.isTouchMove = true
      }
    })
    return items
  }

  _angle(start, end) {
    var _X = end.X - start.X,
      _Y = end.Y - start.Y
    //返回角度 /Math.atan()返回數(shù)字的反正切值
    return 360 * Math.atan(_Y / _X) / (2 * Math.PI);
  }
}

export default touch
  • 然后去引用這個touch.js文件,在app.js文件中
//app.js
import touch from './utils/touch.js'//新加
App({
  globalData: {
    userInfo: null
  },
  touch: new touch() //實例化這個touch對象
})

末尾

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末跃巡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子牧愁,更是在濱河造成了極大的恐慌瓷炮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件递宅,死亡現(xiàn)場離奇詭異娘香,居然都是意外死亡苍狰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門烘绽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淋昭,“玉大人,你說我怎么就攤上這事安接∠韬觯” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵盏檐,是天一觀的道長歇式。 經(jīng)常有香客問我,道長胡野,這世上最難降的妖魔是什么材失? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮硫豆,結(jié)果婚禮上龙巨,老公的妹妹穿的比我還像新娘。我一直安慰自己熊响,他們只是感情好旨别,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汗茄,像睡著了一般秸弛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洪碳,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天递览,我揣著相機與錄音,去河邊找鬼偶宫。 笑死,一個胖子當著我的面吹牛环鲤,可吹牛的內(nèi)容都是我干的纯趋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冷离,長吁一口氣:“原來是場噩夢啊……” “哼吵冒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起西剥,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤痹栖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瞭空,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揪阿,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡疗我,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了南捂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吴裤。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溺健,靈堂內(nèi)的尸體忽然破棺而出麦牺,到底是詐尸還是另有隱情,我是刑警寧澤鞭缭,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布剖膳,位于F島的核電站,受9級特大地震影響岭辣,放射性物質(zhì)發(fā)生泄漏吱晒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一易结、第九天 我趴在偏房一處隱蔽的房頂上張望枕荞。 院中可真熱鬧,春花似錦搞动、人聲如沸躏精。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矗烛。三九已至,卻和暖如春箩溃,著一層夾襖步出監(jiān)牢的瞬間瞭吃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工涣旨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留歪架,地道東北人。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓霹陡,卻偏偏與公主長得像和蚪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子烹棉,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,098評論 1 32
  • [root@www ~]# vim /etc/ansible/hosts Ex 1: Ungrouped host...
    如來自然閱讀 1,452評論 0 0
  • 也許他今天要說的也是我想說的攒霹,幾個月的相處,他早已把我看透浆洗,我卻看不清楚他到底是愛還是喜歡催束, 女人可能都是這樣,吵...
    牛寶寶_e6fe閱讀 284評論 0 0
  • 學(xué)校有一只大白貓伏社,胖得總教人懷疑她是懷寶寶了抠刺。 直到塔淤,聽人說他是男孩子。 貓兒的防備心很重矫付,不輕易靠近人凯沪。可是學(xué)校...
    葉深丫閱讀 277評論 0 0
  • 2018年12月24日 星期一 天氣:晴 為什么人與人之間會有誤解买优?或者說人與人之間沒有辦法溝通妨马。因為大部分...
    金魚茵茵閱讀 752評論 0 0