Vue カプセル化に基づくプルダウン更新およびプルアップ読み込みコンポーネント

Vue カプセル化に基づくプルダウン更新およびプルアップ読み込みコンポーネント

VueとネイティブJavaScriptカプセル化に基づいて、プルダウンリフレッシュとプルアップロードコンポーネントが参考用に提供されています。具体的な内容は次のとおりです。

  • upTilteスロットはプルダウンリフレッシュのカスタムコンテンツが配置される場所です
  • downTilteスロットはプルアップから読み込まれたカスタムコンテンツが配置される場所です
  • デフォルトのスロットはリストコンテンツ領域です

コンポーネントコードは次のとおりです

<テンプレート>
  <div class="refresh" id="refresh">
    <スロット名="上傾斜"></スロット>
    <スロット></スロット>
    <スロット名="下傾斜"></スロット>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前: 'PullupOrPulldownRefresh',
  小道具: {
    // 最大移動距離 maxMove: {
      タイプ: 数値、
      デフォルト: 300
    },
    // 減衰係数摩擦: {
      タイプ: 数値、
      デフォルト: 0.3
    }
  },
  データ() {
    戻る {
      開始Y: 0,
      ul: ヌル、
      描画: null、
      上: null、
      ダウン: null、
      y: 0 // 慣性反発距離}
  },
  マウント() {
    this.$nextTick(() => {
      this.draw = document.getElementById('refresh')
      this.ul = this.draw.children[1]
      this.up = this.draw.children[0]
      this.down = this.draw.children[2]
      this.draw.addEventListener('touchstart', this.touchstart)
      this.draw.addEventListener('touchmove', this.touchmoveEvent)
      this.draw.addEventListener('touchend', this.touchendEvent)
    })
  },
  メソッド: {
    // タッチ開始イベント touchstart(event) {
      this.startY = イベント.changedTouches[0].clientY
    },
    // タッチ移動イベント touchmoveEvent(event) {
      定数高さ = this.ul.clientHeight - this.draw.clientHeight
      高さ === this.draw.scrollTop || this.draw.scrollTop === 0 の場合 {
        var a = event.changedTouches[0].clientY - this.startY
        this.y = a <= this.maxMove ? a : this.maxMove
        // ラグの問題を解消するには、トランジション効果をクリアする必要があります this.ul.style.transition = 'none'
        this.ul.style.transform = 'translateY(' + this.friction * this.y + 'px)'
        // ステータスを変更する const upHeight = -this.up.clientHeight + this.friction * this.y
        // 開始するには下に引っ張る if (this.friction * this.y > 0) (this.setStatus(this.friction * this.y), this.up.style.transition = 'none', this.up.style.transform = 'translateY(' + upHeight + 'px) translateX(-50%)')
        // 引き上げて開始します if (this.friction * this.y < 0) (this.setStatus(this.friction * this.y), this.down.style.transition = 'none', this.down.style.marginTop = this.friction * this.y + 'px')
      }
    },
    // タッチ終了イベント touchendEvent(event) {
      this.friction * this.y >= 50 の場合、 this.$emit('RefreshUp', this.friction * this.y)
      そうでない場合 (this.friction * this.y < -50) this.$emit('RefreshDown', this.friction * this.y)
      それ以外の場合は this.resetStyle()
    },
    // リセットしてトランジション効果を追加する resetStyle() {
      this.ul.style.transition = '.6s を変換'
      this.ul.style.transform = 'translateY(' + 0 + 'px)'
      this.up.style.transition = 'すべて .6'
      this.up.style.transform = 'translateY(-' + this.up.clientHeight + 'px) translateX(-50%)'
      this.down.style.transition = 'すべて .6'
      this.down.style.marginTop = -this.down.clientHeight + 'px'
    },
    // 更新ステータスを設定する setStatus(y) {
      this.$emit('setStatus', y)
    }
  }
}
</スクリプト>

<スタイル lang="scss">
.リフレッシュ{
  幅: 100%;
  高さ:100vh;
  境界線: 2px 実線 #ccc;
  位置: 相対的;
  オーバーフロー: 非表示;
  オーバーフロー:自動;
  位置: 固定;
  ul {
    ズーム: 1;
    パディング: 0 10%;
  }

  ul::after {
    コンテンツ: '';
    表示: ブロック;
    可視性: 非表示;
    高さ: 0;
    クリア: 両方;
  }

  li {
    リストスタイル: なし;
    幅: 100%;
    高さ: 50px;
    行の高さ: 50px;
    テキスト配置: 中央;
  }
  .UpRefresh{
    位置: 絶対;
    左: 50%;
    変換: translateX(-50%);
    Zインデックス: -9;
  }
  .ダウンリフレッシュ{
    位置: 相対的;
    左: 50%;
    変換: translateX(-50%);
    上マージン: -10px;
    Zインデックス: -9;
  }
}
</スタイル>
  • コンポーネントの使用方法
  • 摩擦は摩擦係数である
  • @RefreshUpは、ユーザーが特定の距離まで引き下げたときにイベントをトリガーします。
  • @RefreshDownは、デバイスが特定の距離まで引き上げられたときにイベントをトリガーします。
  • @setStatusは更新ステータスを変更するメソッドです
<テンプレート>
  <div>
    <プルアップまたはプルダウン更新
      ref="プルアップまたはプルダウン更新"
      :maxMove="最大移動"
      :friction="摩擦"
      @RefreshUp="リフレッシュアップ"
      @RefreshDown="リフレッシュダウン"
      @setStatus="ステータスを設定"
    >
      <テンプレート v-slot:upTilte>
        <!-- <div class="UpRefresh" v-show="isUpRefresh">{{ アップタイトル }}</div> -->
        <div class="UpRefresh" v-show="isUpRefresh">
          <img :src="require('@/assets/logo.png')" alt="" />
          <p>{{ アップタイトル }}</p>
        </div>
      </テンプレート>
      <ul>
        <li
          v-for="(item, index) データ内"
          :key="インデックス"
          スタイル="背景: オレンジ"
        >
          {{ アイテム }}
        </li>
      </ul>
      <テンプレート v-slot:downTilte>
        <div class="DownRefresh" v-show="isDownRefresh">{{ ダウンタイトル }}</div>
      </テンプレート>
    </プルアップまたはプルダウン更新>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  データ() {
    戻る {
      最大移動: 300,
      摩擦: 0.3、
      データ: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
      isUpRefresh: false、
      isDownRefresh: false、
      下タイトル: 「さらに読み込むには上に引っ張ってください」
      アップタイトル: 「下に引っ張って更新」
    }
  },
  メソッド: {
    ステータスを設定する(y) {
      (y && y > 0)の場合{
        this.isUpRefresh = true
        this.Uptitle = '下に引いて更新'
        if (y >= 50) this.Uptitle = 'リリースして更新'
        戻る
      }
      this.isDownRefresh = true
      this.Downtitle = 'さらに読み込むには上に引っ張ってください'
      if (y <= -50) this.Downtitle = 'さらに読み込むには離してください'
    },
    リフレッシュアップ(y) {
      (!y) の場合、戻り
      (y >= 50)の場合{
        this.Uptitle = 'リフレッシュ'
        タイムアウトを設定する(() => {
          (var i = 1; i <= 10; i++) の場合 {
            this.data.push(this.data[this.data.length - 1] + 1)
          }
          this.$refs.PullupOrPulldownRefresh.resetStyle() // リバウンドリセット}, 1000)
      }
    },
    リフレッシュダウン(y) {
      (!y) の場合、戻り
      (y <= -50)の場合{
        this.Downtitle = '読み込み中'
        タイムアウトを設定する(() => {
          (var i = 1; i <= 10; i++) の場合 {
            this.data.push(this.data[this.data.length - 1] + 1)
          }
          this.$refs.PullupOrPulldownRefresh.resetStyle() // リバウンドリセット}, 1000)
      }
    }
  }
}
</スクリプト>

<スタイル スコープ lang="scss">
.UpRefresh画像{
  幅: 30ピクセル;
}
</スタイル>

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vant フレームワークを使用して H5 を実行する際の落とし穴を解決します (プルダウンして更新、プルアップして読み込みなど)。
  • Vant に基づくプルアップ読み込みとプルダウン更新の Vue サンプルコード
  • vant における van-list の使用
  • Vant-list におけるプルアップ読み込みとプルダウン更新の問題について簡単に説明します。

<<:  検証例 MySQL | 同じ値を持つフィールドを更新すると、binlog に記録されます

>>:  Docker イメージ + nginx を使用して Vue プロジェクトをデプロイする方法

推薦する

vue プロジェクトのデプロイと Nginx でのプロキシ設定の問題の分析

1. nginxをインストールして起動する # nginxをインストールする sudo apt-ge...

Linux で測位バックグラウンド サービスが時々クラッシュする問題の解決方法

問題の説明最近のバックグラウンドサービスでは、特定の命令の要求データをディスクに保存する新しい機能が...

JSにおける4つのデータ型判定方法

目次1. 型2. インスタンス3. コンストラクター4.toString() この記事では、4 つの...

CSS 3.0 テキストホバージャンプ特殊効果コード

これは、CSS 3.0 で実装されたテキストのホバーとジャンプ効果です。効果は次のとおりです。 以下...

ElementUI のネストされたテーブルに基づいて複数選択を実装するためのサンプル コード

序文:私は友人のプロジェクトのバグを修正するのを手伝ったのでこれを書きました。この関数を書くのは初め...

CSS でフロートをクリアするための完全ガイド (要約)

1. 親divは疑似クラスafterとzoomを定義します <スタイル タイプ="...

Element-uiはテーブル内のセルを直接クリックして編集します

目次成果を達成する実装コード最近、会社でelementUIを使い始めたため、開発の過程でテーブルのセ...

JavaScriptイベント実行メカニズムの深い理解

目次序文ブラウザJS非同期実行の原理ブラウザのイベントループ実行スタックとタスクキューマクロタスクと...

Alibaba Cloud Server Ubuntu 上の Workbench が MySQL に接続できない問題の解決策 (テスト済み)

過去 2 日間、ワークベンチが Alibaba Cloud Server に接続できない問題を解決す...

Linuxファイルの基本属性の知識ポイントのまとめ

Linux システムは典型的なマルチユーザー システムです。異なるユーザーは異なる立場にあり、異なる...

Ubuntu 18.0.4 MySQL 8.0.20 のインストールと設定方法のグラフィックチュートリアル

MySQL 8.0.20 のインストールおよび設定方法は、参考としてグラフィック チュートリアルにま...

docker pullがリセットされる問題を解決する

この記事では、docker pull がリセットされる問題を解決する方法を紹介し、皆さんと共有します...

Linux インストール MongoDB の起動と一般的な問題の解決

MongoDB のインストール プロセスと問題記録1. MongoDBのインストールMongoDBを...

DOCTYPE HTMLを使用する理由

これがないと、ブラウザはページをレンダリングするときに Quirks モードを使用することがわかって...

MySQL 5.7.15 バージョンのインストールと設定方法のグラフィックチュートリアル

この記事では、MySQLバージョン5.7のインストール方法と使用方法、およびデータベースデータの保存...