首頁 web前端 uni-app uniapp左滑出現刪除按鈕

uniapp左滑出現刪除按鈕

May 22, 2023 am 10:10 AM

隨著智慧型手機的普及和行動互聯網的發展,越來越多的人開始使用手機進行各種操作,其中包括使用各種應用程式。在應用程式中,我們通常會遇到一些清單數據,例如通訊錄、訊息清單、訂單清單等等。這些清單經常需要對資料進行操作,例如查看詳情、標記已讀、刪除等等。其中,刪除操作是較常見的一種操作,本篇文章將聚焦於如何在UniApp中實現一個左滑出現刪除按鈕的效果。

UniApp是一款跨平台開發框架,可在同一個程式碼基礎上,同時產生多個運行平台(包括iOS、Android、H5、小程式、快應用程式等)的應用程式。這使得開發者無需為每個平台單獨編寫程式碼,大大提高了開發效率,降低了開發成本。本文的範例程式碼將使用UniApp開發框架中的Vue.js部分作為基礎。

一、實作想法

實現左滑出現刪除按鈕的效果,一般的做法是在清單項目中新增一個可滑動的區域,當使用者向左滑動該區域時,顯示刪除按鈕。為了確保同時支援多個平台,我們需要考慮在行動裝置上的觸控操作和在PC端的滑鼠操作。基於此,我們需要實現以下邏輯:

  1. 滑動操作:監聽使用者操作,並判斷使用者是否在目標區域內進行了滑動操作。
  2. 操作區域:需要在清單項目中新增一個可滑動的區域。
  3. 顯示刪除按鈕:當使用者在目標區域內向左滑動時,顯示刪除按鈕。
  4. 隱藏刪除按鈕:當使用者在目標區域內向右滑動時,隱藏刪除按鈕。
  5. 點擊刪除按鈕:當使用者點擊刪除按鈕時,觸發刪除動作。

二、實作過程

  1. 建立清單頁面和清單項目元件

首先我們需要建立一個清單頁面和一個清單項目元件,這裡我們使用uni-ui框架中的list元件和list-item元件作為基礎,以便實現一些基礎的樣式和佈局。具體程式碼如下:

<!-- list.vue -->
<template>
  <view>
    <list>
      <list-item
        v-for="(item, index) in list"
        :key="index"
        :data-index="index"
        :class="item.active ? 'item-active' : ''"
      >
        <view
          class="item-content"
          @touchstart="onTouchStart(index, $event)"
          @touchmove="onTouchMove(index, $event)"
          @touchend="onTouchEnd(index, $event)"
          @mousedown="onMouseDown(index, $event)"
          @mousemove="onMouseMove(index, $event)"
          @mouseup="onMouseUp(index, $event)"
        >
          <view class="item-title">{{item.title}}</view>
          <view class="item-delete" v-show="item.active" @click="onDeleteItem(index)">删除</view>
        </view>
      </list-item>
    </list>
  </view>
</template>

<script>
export default {
  data() {
    return {
      list: [
        { title: '列表项1', active: false },
        { title: '列表项2', active: false },
        { title: '列表项3', active: false },
        { title: '列表项4', active: false },
        { title: '列表项5', active: false },
      ],
      // 记录当前操作列表项的索引、起始滑动位置、当前滑动位置等信息
      currentIndex: -1,
      startX: 0,
      startY: 0,
      moveX: 0,
      moveY: 0,
    };
  },
  methods: {
    onTouchStart(index, event) {
      this.handleTouchStart(index, event.changedTouches[0].pageX, event.changedTouches[0].pageY);
    },
    onTouchMove(index, event) {
      this.handleTouchMove(index, event.changedTouches[0].pageX, event.changedTouches[0].pageY);
    },
    onTouchEnd(index, event) {
      this.handleTouchEnd(index, event.changedTouches[0].pageX, event.changedTouches[0].pageY);
    },
    onMouseDown(index, event) {
      this.handleTouchStart(index, event.pageX, event.pageY);
    },
    onMouseMove(index, event) {
      this.handleTouchMove(index, event.pageX, event.pageY);
    },
    onMouseUp(index, event) {
      this.handleTouchEnd(index, event.pageX, event.pageY);
    },
    handleTouchStart(index, x, y) {
      if (this.currentIndex !== -1) {
        return;
      }
      this.currentIndex = index;
      this.startX = x;
      this.startY = y;
    },
    handleTouchMove(index, x, y) {
      if (this.currentIndex !== index) {
        return;
      }
      this.moveX = x;
      this.moveY = y;
      const deltaX = this.moveX - this.startX;
      const deltaY = this.moveY - this.startY;
      if (Math.abs(deltaX) > Math.abs(deltaY)) {
        if (deltaX < 0) {
          this.list[index].active = true;
        } else {
          this.list[index].active = false;
        }
      }
    },
    handleTouchEnd(index, x, y) {
      if (this.currentIndex !== index) {
        return;
      }
      this.currentIndex = -1;
      this.moveX = x;
      this.moveY = y;
      const deltaX = this.moveX - this.startX;
      const deltaY = this.moveY - this.startY;
      if (Math.abs(deltaX) > Math.abs(deltaY)) {
        if (deltaX < 0) {
          this.list[index].active = true;
        } else {
          this.list[index].active = false;
        }
      }
    },
    onDeleteItem(index) {
      this.list.splice(index, 1);
    },
  },
};
</script>

<style lang="scss">
.item-active .item-content {
  transform: translateX(-60px);
}

.item-content {
  position: relative;
  height: 60px;
  padding: 0 20px;
  line-height: 60px;
  background-color: #fff;
  border-bottom: 1px solid #eee;
  overflow: hidden;

  .item-delete {
    position: absolute;
    top: 0;
    right: 0;
    height: 100%;
    padding: 0 20px;
    line-height: 60px;
    background-color: #f00;
    color: #fff;
    font-size: 18px;
  }
}
</style>
登入後複製

這裡我們在清單項目元件的item-content中新增了一個滑動事件監聽和一個刪除按鈕,透過在資料中新增一個active欄位來控制顯示和隱藏刪除按鈕。在樣式中我們透過transform屬性實現左滑效果,並透過overflow:hidden屬性隱藏刪除按鈕。

  1. 監聽滑動事件

我們需要監聽觸控事件實作滑動操作,程式碼中使用了單點觸控(touch事件)和滑鼠事件(mousedown、mousemove、mouseup事件)監聽使用者滑動操作。具體實作細節可參考上述程式碼。

  1. 控制刪除按鈕的顯示和隱藏

當使用者在目標區域內向左滑動時,我們需要顯示刪除按鈕;當使用者在目標區域內向右滑動時,我們需要隱藏刪除按鈕。這裡我們透過新增active欄位來實現刪除按鈕的控制。當使用者向左滑動時,我們將active欄位置為true,反之則置為false。

  1. 點擊刪除按鈕觸發刪除動作

當使用者點擊刪除按鈕時,我們需要觸發刪除動作。這裡我們透過Vue.js元件實例的splice方法從資料中刪除目前項,具體實作可參考範例程式碼中的onDeleteItem方法。

三、總結

至此,我們已經完成了在UniApp中實現一個左滑出現刪除按鈕的效果。透過實現滑動事件、控制刪除按鈕的顯示和隱藏、以及點擊刪除按鈕觸發刪除操作,我們可以在清單資料中方便地新增刪除操作。

值得注意的是,在實際開發中,我們可能需要滿足更多的需求,例如在刪除操作前進行詢問、支援多重選擇刪除等。在此基礎上,我們可以根據實際需求進行更多的擴展和優化,以提升應用程式的使用者體驗。

以上是uniapp左滑出現刪除按鈕的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1250
24