Vueモバイル端末は左スライド編集と削除の全プロセスを実現します

Vueモバイル端末は左スライド編集と削除の全プロセスを実現します

序文

プロジェクトのニーズに応じて、Vue-touch を使用して、vue モバイル端末の左スワイプ編集および削除機能を実装します。さっそく、効果図を最初に見てから、コードを見てみましょう。

方法は次のとおりです。

ステップ1: vue-touchをインストールする

npm をインストール vue-touch@next --save

ステップ2: main.jsにインポートする

'vue-touch' から VueTouch をインポートします。
Vue.use(VueTouch, {
  名前: 'v-touch'
});

ステップ3: 使用(v-touchを使用して、左にスワイプして削除するコンテンツをラップします)

<div class="wrap">
      <vタッチ
        スタイル="margin-bottom:10px"
        v-on:panstart="onPanStart(キー)"
        v-on:panmove="onPanMove"
        v-on:panend="onPanEnd"
        v-for="(リスト内の項目、キー)"
        :key="キー"
      >
  <!-- 下の div は、私のページで左にスワイプして削除する必要がある項目の内容です。独自のものに置き換えることができます -->
        <div class="item df_sb item-p" :style="activeId === key ? スワイプ : ''">
          <p class="left-img">
            <img :src="item.image_url" alt>
          </p>
          <p class="url" v-if="item.redirect_url != '' ">{{item.redirect_url}}</p>
          <p class="city nothave" v-else>なし</p>
          <p class="city">{{item.city}}</p>
          <div class="edit-delete df_sad" :ref="'editBtn' + キー">
            <div class="edit" @click="editFun('edit',item.id,item.image_url,item.redirect_url)">
              <img src="../../assets/images/adver/ic_xiugai.png" alt>
            </div>
            <p class="edit-line"></p>
            <div class="ad-delete" @click="deleteFun(key,item.id)">
              <img src="../../assets/images/adver/ic_shanchu.png" alt>
            </div>
          </div>
        </div>
      </v-タッチ>
    </div>

ステップ 4: 変数とメソッドを定義します。次のコードを直接コピーし、不要なものを削除して独自のものに置き換え、必要なものは保持することができます。

<スクリプト>
「../../http/httpApi」からhttpApiをインポートします。
エクスポートデフォルト{
  名前: ""、
  データ() {
    戻る {
      swipe: "", // スライド スタイル wd: 0, // 編集ボタンと削除ボタンの幅の合計 swipeWd: 0, // スライドした距離 activeId: "", // 実際には最後のアクティビティ ID
    //上記の4つの変数は保持する必要があり、次の3つは削除できます。ページ: 1、
      サイズ: 10,
      リスト: []
    };
  },
  メソッド: {
//リストデータをリクエストする getList($state) {
      params = new URLSearchParams();
      params.append("ページ", this.page);
      パラメータを追加します("サイズ", this.size);
      this.$post(httpApi.BANNERLIST、パラメータ)
        .then(res => {
          (res.code == 10000)の場合{
            (res.data)の場合{
              this.list = this.list.concat(res.data.list);
              this.page++;
              (res.data.list.length === 10)の場合{
                $state.loaded();
              } それ以外 {
                $state.complete();
              }
            } それ以外 {
              $state.complete();
            }
          } それ以外 {
            $state.complete();
          }
        })
        .catch(エラー => {
          コンソールログ(エラー);
        });
    },
    // 編集 editFun(type, image_id, image, url) {
      this.$router.push({
        パス: "/issueAdvertising",
      });
    },
    // 削除 deleteFun(index, image_id) {
      this.activeId = ""; // 最後のアクティビティ ID を空にします let params = new URLSearchParams();
      パラメータを追加します("agent_id", this.id);
      パラメータを追加します。
      this.$post(httpApi.DELETEBANNER、パラメータ)
        .then(res => {
          (res.code == 10000)の場合{
// インターフェースを削除するリクエストによりリスト内の項目の 1 つが削除されますが、ページにはまだ項目が残っているため、完璧になるようにローカル配列内の項目も削除する必要があります。次のコード行はより重要であり、インターフェースを正常に削除する場所に記述できます。this.list.splice(index, 1); 
            this.modal.toastFun("正常に削除されました");
          } そうでない場合 (res.code == 20000) {
            this.modal.toastFun(res.message);
          }
        })
        .catch(エラー => {});
    },
 
// 以下の 3 つのメソッドはすべて変更せずにコピーされます // スライド位置 onPanStart(id) {
      イベントをデフォルトにしない();
      // 右ボタンの幅を取得します。let str = "editBtn" + id;
      this.wd = 1.2 * this.$refs[str][0].offsetWidth;
      // 初期化 if (this.activeId != id) {
        this.swipe = "transform:translateX(0px)";
        this.swipeWd = 0;
      }
      this.activeId = id;
    },
//スライド位置 onPanMove(event) {
      イベントをデフォルトにしない();
      deltaX = event.deltaX; とします。
      // コンポーネントは最大距離まで左に移動します if (deltaX < 0 && deltaX > -this.wd) {
        //左にスライド this.swipe = "transform:translateX(" + deltaX + "px)";
        this.swipeWd = deltaX;
      }
 
      deltaX > 0 && deltaX <= this.wd && this.swipeWd < 0 の場合 {
        //右にスワイプ let wx = deltaX + this.swipeWd;
        this.swipe = "transform:translateX(" + wx + "px)";
      }
    },
 // 終了位置 onPanEnd(event) {
      イベントをデフォルトにしない();
      // 左に移動した距離が半分より大きいかどうかを判断します。let deltaX = event.deltaX;
      (デルタX < 0)の場合{
        (デルタX <= -this.wd / 2)の場合{
          // 半分以上左にスライドします this.swipe = "transform:translateX(" + -this.wd + "px)";
          this.swipeWd = -this.wd;
        } それ以外 {
          this.swipe = "transform:translateX(0px)";
          this.swipeWd = 0;
        }
      } それ以外 {
        (this.swipeWd < 0 && deltaX >= this.wd / 2)の場合{
          // 半分以上左にスライドします this.swipe = "transform:translateX(0px)";
          this.swipeWd = 0;
        } それ以外 {
          this.swipe = "transform:translateX(" + this.swipeWd + "px)";
        }
      }
    }
  },
 
};
</スクリプト>

スタイル

上記のコードのCSSスタイルのみを掲載しました。必要に応じて削除してください。必要なものは残し、不要なものは削除し、変更が必要な場合は自分で修正してください。

。包む {
  幅: 100%;
  高さ: 100%;
  オーバーフロー: 非表示;
}
。アイテム {
  左パディング: 40px;
  高さ: 120px;
  背景: #ffffff;
  アイテムの位置を中央揃えにします。
  flex-direction: 継承;
  .left-img {
    幅: 120ピクセル;
    高さ: 100px;
    オーバーフロー: 非表示;
    画像 {
      最小幅: 120px;
      高さ: 100px;
    }
  }
}
.url {
  幅: 400ピクセル;
  パディング: 10px 30px 0;
  ボックスのサイズ: 境界線ボックス;
  単語折り返し: 単語を区切る;
  テキスト配置: 中央;
  オーバーフロー: 非表示;
  テキストオーバーフロー: 省略記号;
  空白: ラップなし;
}
。市 {
  テキスト配置: 中央;
  最小幅: 100px;
}
.item-p {
  色: #333333;
  フォントサイズ: 22px;
}
.nothave {
  色: #999999;
}
.ヒント{
  高さ: 40px;
  アイテムの位置を中央揃えにします。
  下部マージン: 30px;
}
。ライン {
  幅: 250ピクセル;
  高さ: 1px;
  背景: #999999;
  不透明度: 0.5;
}
。アイテム {
  width: 120%; // 100%以上
  transition: 0.1s ease 0s; // トランジション効果}
.編集行 {
  幅: 2px;
  高さ: 80px;
  背景: rgba(255, 255, 255, 1);
}
.編集削除{
  幅: 160ピクセル;
  高さ: 100%;
  背景: rgba(255, 126, 34, 1);
  不透明度: 0.8;
  アイテムの位置を中央揃えにします。
}
。編集、
.ad-delete {
  画像 {
    幅: 42px;
    高さ: 42px;
  }
}
.add-btn {
  幅: 200ピクセル;
  高さ: 80px;
  背景: rgba(255, 126, 34, 1);
  ボックスの影: 0px 0px 5px 0px rgba(221, 221, 236, 1);
  境界線の半径: 40px;
  テキスト配置: 中央;
  行の高さ: 80px;
  色: #ffffff;
  フォントサイズ: 30px;
  位置: 固定;
  下位:8%
  左: 50%;
  変換: translateX(-50%);
}

要約する

必要に応じて、必要に応じて少し変更を加えることができます。非常に詳細に書かれています。これは、vueモバイル端末で左スワイプ編集と削除を実装するプロセス全体に関するこの記事の終わりです。より関連性の高いvue左スワイプ編集と削除コンテンツについては、123WORDPRESS.COMで以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も123WORDPRESS.COMを応援してください。

以下もご興味があるかもしれません:
  • Vue は QQ の左スワイプでコンポーネントを削除する機能を模倣します
  • VueはMint UIを使用して左スワイプ削除効果CellSwipeを実装します
  • Vue.js モバイル左スワイプ削除コンポーネント実装コード
  • vue2 をベースに左スワイプ削除機能を実装する
  • Vueを使用して、ソースコードでモバイル端末の左スワイプ削除効果を実装する
  • MpvueアプレットはQQの左スワイプを模倣して上部のコンポーネントを削除します
  • Vue 左スワイプ削除機能のサンプルコード
  • Vue プロジェクトは左スワイプ削除機能を実装します (完全なコード)

<<:  MySQL で指定した桁数の乱数を生成する方法と、バッチで乱数を生成する方法

>>:  Dockerイメージをインポートおよびエクスポートする方法

推薦する

AngularでTweenMaxアニメーションライブラリを使用する際の問題と解決策

最近何もすることがないのでCSSをいじっていますより良いアニメーションライブラリTweenMaxを見...

JavaScript フロー制御 (ループ)

目次1. forループ2. 二重の for ループ3. whileループ4. dowhileループ5...

mybatis-plusページングパラメータが渡された後、SQLのwhere条件にはページング情報操作の制限がありません

2時間近くかけて、さまざまな方法を試しました。後で、whereでフィルタリングした後のデータ量が1ペ...

React の 10 個のフックの紹介

目次ReactHook とは何ですか? Reactは現在フックを提供している1. 使用状態2.use...

Windows 64 ビットでの MySQL 8.0.13 のインストールと設定方法のグラフィック チュートリアル

この記事では、MySQL 8.0.13のインストールと設定のチュートリアルを参考までに紹介します。具...

crontab でスケジュールされたタスクが実行されない理由の概要

序文最近、仕事でいくつかの問題が発生しました。crontab でスケジュールされたタスクが実行されま...

docker compose を使ってワンクリックで分散構成センター Apollo を展開するプロセスの詳細な説明

導入分散について話すときは、分散構成センター、分散ログ、分散リンク トラッキングなどについて考える必...

セマンティックウェブページ XHTML セマンティックマークアップ

構造とプレゼンテーションを分離するもう 1 つの重要な側面は、セマンティック マークアップを使用して...

dockerを使用してTomcatをデプロイし、Skywalkingに接続する

目次1. 概要2. dockerを使用してTomcatをデプロイし、Skywalkingに接続する要...

MySQL 5.7.18 リリース インストール ガイド (bin ファイル バージョンを含む)

インストール プロセスは、コンパイル手順を除いて、基本的にソース バージョンと同じです。この記事では...

CocosCreatorプロジェクト構造の仕組みの詳細な説明

目次1. プロジェクトフォルダ構造1. アセットフォルダ2. 図書館3. ローカル設定(ローカル) ...

MySQL における「:=」と「=」の違いの簡単な分析

=設定および更新の場合にのみ、:= と同じ効果、つまり代入効果があり、それ以外の場合は等号の効果があ...

LinuxのCPU負荷とCPU使用率の詳細な説明

CPU 負荷と CPU 使用率これらは両方とも、ある程度、マシンの忙しさを反映できます。 CPU 使...

Vue3は独自のページングコンポーネントをカプセル化します

この記事の例では、vue3 が独自のページングコンポーネントをカプセル化する具体的なコードを参考まで...

MySQLループは数千万のデータを挿入する

1. テストテーブルを作成する テーブル `mysql_genarate` を作成します ( `id...