在最近的微信小程式開發過程中需要用到側滑刪除的功能,微信小程式官方是沒有提供這樣的元件,再加上我們的微信小程式使用的是wepy元件開發框架開發的,wepy也沒有提供這樣的元件,之前也在github上搜尋這方面的元件,沒有發現合適的,當時只發現了一個開源的:github.com/GeoffZhu/we… 只不過該元件功能單一已經被作者廢棄了,無奈自己動手擼了一個側滑刪除元件,現在把它開源出來吧。
Requirements
- wepy: "^1.7.3"
支援功能和特點
- 自定義內容區域:支援之定義內容區域,元件內使用 slot佔位。
- 自定義滾動高度:可以自定義scroll-view的高度,預設為螢幕的高度。
- 自定義menu :如果預設的menu樣式不喜歡可以自定義,也可以顯示或者隱藏指定的menu。
- 左右滑動:支援左右滑動也可以設定只左右或者右滑。
效果如下:
如何使用
目前支援兩種使用模式:
1.page頁面模式
優點:可定製化高,擴充套件性強。
缺點:整合複雜,程式碼複用性差。複製程式碼
2.component 元件模式
優點:整合簡單,程式碼複用性強,減少包的大小。
缺點:可定製到低。複製程式碼
不建議使用page頁面模式,下面詳細介紹component 元件模式的使用
如何使用
// 匯入元件
import SwipeDeleteView from '@/components/wepy-swipe-delete-view'
// 宣告元件
components = {
swipeDelete: SwipeDeleteView
}
// 引用元件
<template>
<swipeDelete :list.sync="list">
<view class="item">{{item.userName}}</view>
</swipeDelete>
</template>複製程式碼
配置如下:
<swipeDelete :list.sync="list"
:scrollHeight="scrollHeight"
@deleteTap.user="deleteTap"
@deleteLongTap.user="deleteLongTap"
@editTap.user="editTap"
@editLongTap.user="editLongTap"
@addTap.user="addTap"
@addLongTap.user="addLongTap"
@markTap.user="markTap"
@markLongTap.user="markLongTap">複製程式碼
屬性 | 屬性說明 | 備註 |
---|---|---|
list | 要顯示的列表的原始資料,最好是加上.sync這樣可以非同步傳值 | 必傳 |
scrollHeight | 設定scroll-view的高度,預設為螢幕高度 | 選傳 |
deleteTap.user | 刪除menu單擊事件回撥 | 必要時傳 |
deleteLongTap.user | 刪除menu長按事件回撥 | 必要時傳 |
editTap.user | 編輯menu單擊事件回撥 | 必要時傳 |
editLongTap.user | 編輯menu長按事件回撥 | 必要時傳 |
addTap.user | 新增menu單擊事件回撥 | 必要時傳 |
addLongTap.user | 新增menu長按事件回撥 | 必要時傳 |
markTap.user | 標記menu單擊事件回撥 | 必要時傳 |
markLongTap.user | 標記menu長按事件回撥 | 必要時傳 |
每個點選事件或者長按事件都會返回兩個引數
methods = {
deleteTap(view, item) {
console.log(item)
view.deleteItem()
},
deleteLongTap(view, item) {
console.log(item)
wx.showModal({
title: '提示',
content: '確定要刪除嗎?',
success: function (res) {
if (res.confirm) {
view.deleteItem()
} else {
view.closeItem()
}
}
})
}
}複製程式碼
- view :view 是SwipeDeleteView物件的本身,可以通過view來做一些其他操作,如:刪除當前的item
- item : item 就是當前操作的原始資料,可以通過item獲取真正需要的資料
當前SwipeDeleteView對外暴露的函式有:
函式名稱 | 函式說明 | 引數 |
---|---|---|
deleteItem | 刪除當前操作的item(原始資料+view)都會被刪除 | 不需要引數 |
closeItem | 關閉當前操作的item,原始資料不變 | 不需要引數 |
網路非同步載入更新
如果使用的網路非同步載入完成以後,還需要更新下元件,不然會出現無法側滑的情況。
- 導致原因:原始資料更新以後元件內部無法監聽到,這樣就不能獲取到左右menu的寬度,所以不能側滑
- 解決辦法:this.$invoke('swipeDelete', 'update'); swipeDelete必須和 components = {swipeDelete: SwipeDeleteView} 同名。
程式碼如下:
// 模擬網路載入延遲2秒鐘
let that = this
setTimeout(function () {
for (let i = 0; i < 20; i++) {
let msg = {}
msg.userName = '' + '使用者' + (i + 1)
msg.msgText = '您有新的訊息'
msg.color = that.buildRandomColor()
msg.height = that.buildRandomHeight()
msg.headerImg = options.avatarUrl
that.list.push(msg)
}
wx.hideLoading()
// 更新元件
that.$invoke('swipeDelete', 'update')
that.$apply()
}, 2000)複製程式碼
如果在使用的過程中遇到什麼問題可以告訴我,我及時修復。