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 プロジェクトをデプロイする方法

推薦する

Innodb システムテーブルスペースのメンテナンス方法

環境説明:実行中の MySQL 環境があります。以前の構成ファイルの設定が単純すぎたため (inno...

Linux でネットワーク パケット損失と遅延をシミュレートする方法

netem と tc: netem は、Linux カーネル バージョン 2.6 以降で提供されるネ...

...

Apple Watchのインタラクションデザインにおける4つの全く異なる体験が明らかに

今日も Watch アプリのデザインに関する話です。私はケーススタディが大好きなので、同じトピックを...

mysql のインデックスと FROM_UNIXTIME に関する問題

ゼロ、背景今週の木曜日にたくさんのアラートを受け取りました。DBA に確認を依頼したところ、遅いクエ...

Nginx で WordPress 擬似静的を設定する方法の例

Baidu の擬似静的の説明を引用します。擬似静的は、実際の静的に相対的です。通常、検索エンジンの使...

vue.js パッケージ化プロジェクトの後の空白ページの解決策

Vueに触れたばかりのパートナーの多くは、開発環境ではVueプロジェクトは正常であるが、パッケージ化...

Docker ロード後にイメージ名が none になる問題の解決方法

最近、docker load -i コマンドを使用してイメージ パッケージを圧縮した後、イメージ名と...

VMware esxi6.5 のインストールと使用の詳細な手順

目次導入建築ESXIの利点vSphere とは何ですか? 2. 仮想マシンの利点3. 仮想マシンを使...

Linux で複数のファイルの名前を一度に変更する方法

序文日常業務では、すべての jpg ファイルを bnp に変更したり、名前の 1 を one に変更...

CSS3+HTML5+JSでブロックの縮小・拡大アニメーション効果を実現

最近、あるプロジェクトに取り組んでいたとき、自分のプロジェクトでは CSS3 のアニメーション技術を...

MySQL 5.x 以降を使用している場合のエラー #1929 列 ''createtime'' の日付時刻値が正しくありません: '''' の簡単な解決方法

MySQL をインストールした後、テーブル データを保存および削除しようとすると、常にエラー メッセ...

VMware Workstationはデバイス/資格情報ガードと互換性がありません

仮想マシンをインストールするときに、「VMware ワークステーションはデバイス/資格情報ガードと互...

アルバムと写真をアルバムに保存するためのWeChatアプレット

私は現在、Xiao Nian Gao に似たビデオおよびツール アプリを開発しています。ユーザーが作...

Linux での grep コマンドの使い方の詳細な説明

Linux grep コマンドLinux の grep コマンドは、ファイル内の条件を満たす文字列を...