Vue3.0 でページング コンポーネントを手動でカプセル化する方法

Vue3.0 でページング コンポーネントを手動でカプセル化する方法

この記事では、vue3.0の手動カプセル化ページングコンポーネントの具体的なコードを参考までに紹介します。具体的な内容は次のとおりです。

1. 親コンポーネントの紹介

src/views/goods/components/goods-comment.vue

<!-- page はページングを初期化するときに表示されるデフォルトのページを示します -->
    <XtxPagination @change-page='changePage' :pagesize='reqParams.pageSize' :total='total' :page='1' />
    // '@/api/product.js' からインターフェース import {findCommentListByGoods } を呼び出す
 エクスポートデフォルト{
  設定(){
  // スクリーニング条件の準備 const reqParams = reactive({
      // 現在のページ番号 page: 1,
      //ページあたりのエントリ数pageSize: 10,
      // 写真があるか hasPicture: null,
      // フィルター条件タグ: null、
      // ソートフィールド sortField: null
    })
    // パラメータの変更を監視する watch(reqParams, () => {
   findCommentListByGoods(goods.value.id, reqParams).then(ret => {
        合計値 = 戻り値の数
        リストの値 = ret.result.items
      })
    }, {
      即時: 真
    })
    // ページ番号の変更を制御する const changePage = (page) => {
      // ページングパラメータを変更し、インターフェースを再度呼び出します reqParams.page = page
    }
    
  }
 }

2. サブコンポーネント

src/コンポーネント/ライブラリ/xtx-pagination.vue

<テンプレート>
  <div class="xtx-pagination">
    <a @click='changePage(false)' href="javascript:;" :class="{disabled: currentPage===1}">前のページ</a>
    <span v-if='currentPage > 3'>...</span>
    <a @click='changePage(item)' href="javascript:;" :class='{active: currentPage===item}' v-for='リスト内のアイテム' :key='item'>{{item}}</a>
    <span v-if='currentPage < pages - 2'>...</span>
    <a @click='changePage(true)' href="javascript:;" :class='{disabled: currentPage===pages}'>次のページ</a>
  </div>
</テンプレート>
<スクリプト>
'vue' から { computed, ref } をインポートします。

エクスポートデフォルト{
  名前: 'XtxPagination'、
  小道具: {
    合計:
      タイプ: 数値、
      デフォルト: 80
    },
    ページサイズ: {
      タイプ: 数値、
      デフォルト: 10
    }
    //デフォルトの初期ページ番号// page: {
    // 型: 数値、
    // デフォルト: 1
    // }
  },
  セットアップ (props, { 出力, attrs }) {
    // attrs は親コンポーネントから渡された属性を表しますが、props は属性を受け取らないため、応答しません // ​​中間ページ番号情報を動的に計算します // ページあたりの項目数 // const pagesize = 8
    // ページの総数 let pages = Math.ceil(props.total / props.pagesize)
    //現在のページ番号// console.log(attrs.page)
    const currentPage = ref(attrs.page || 1)
    // ページ番号リストを動的に計算する const list = computed(() => {
      // 親コンポーネントから渡された合計値が変わると、計算プロパティは再計算されます pages = Math.ceil(props.total / props.pagesize)
      定数結果 = []
      // 合計ページ数は 5 以下、5 より大きい
      ページ数 <= 5 の場合
        // 合計ページ数は 5 以下です for (let i = 1; i <= pages; i++) {
          結果.push(i)
        }
      } それ以外 {
        // 合計ページ数が 5 より大きい
        (現在のページの値 <= 2) の場合 {
          // 左臨界値 for (let i = 1; i <= 5; i++) {
            結果.push(i)
          }
        } そうでない場合 (currentPage.value >= pages - 1) {
          // 右臨界値 for (let i = pages - 4; i <= pages; i++) {
            結果.push(i)
          }
        } それ以外 {
          // 中間状態 for (let i = currentPage.value - 2; i <= currentPage.value + 2; i++) {
            結果.push(i)
          }
        }
      }
      結果を返す
    })
    // 前のページと次のページの変更を制御する const changePage = (type) => {
      (型 === false)の場合{
        // 前のページ // 最初のページの場合はクリック操作は禁止 if (currentPage.value === 1) return
        (現在のページの値 > 1) の場合 {
          現在のページの値 -= 1
        }
      } そうでない場合 (type === true) {
        // 次のページ // 最後のページの場合、クリック操作は禁止されます if (currentPage.value === pages) return
        (currentPage.value < ページ) の場合 {
          現在のページの値 += 1
        }
      } それ以外 {
        // ページをクリック currentPage.value = type
      }
      出力('change-page', currentPage.value)
    }
    { リスト、現在のページ、ページ、変更ページ } を返します。
  }
}
</スクリプト>
<style スコープ lang="less">
.xtxページネーション{
  ディスプレイ: フレックス;
  コンテンツの中央揃え: 中央;
  パディング: 30px;
  > {
    表示: インラインブロック;
    パディング: 5px 10px;
    境界線: 1px 実線 #e4e4e4;
    境界線の半径: 4px;
    右マージン: 10px;
    &:ホバー{
      色: @xtxColor;
    }
    &。アクティブ {
      背景: @xtxColor;
      色: #fff;
      境界線の色: @xtxColor;
    }
    &。無効 {
      カーソル: 許可されていません。
      不透明度: 0.4;
      &:ホバー{
        色: #333;
      }
    }
  }
  > スパン {
    右マージン: 10px;
  }
}
</スタイル>

知識ポイント: attrs は親コンポーネントから渡された属性を表しますが、props は属性を受け取らないため、応答性がありません (vue3 の新機能)

3. 成果を達成する

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

以下もご興味があるかもしれません:
  • Vue.js ベースのテーブル ページング コンポーネント
  • Vue ベースのページング コンポーネントをカプセル化する方法
  • Vue ページング コンポーネント テーブル ページバーの使用例の分析
  • Vueはページングコンポーネントを実装します
  • Vue.js はカスタムページングコンポーネント vue-paginaiton を実装します
  • vue.js を使用してページング コンポーネントを作成する
  • 要素 UI ページング コンポーネントのカプセル化に基づく Vue サンプル コード
  • Vue グローバル ページング コンポーネントの実装コード
  • vue2 ベースのテーブルページングコンポーネントの実装方法
  • Vue ベースのスワイプ ページング コンポーネントの実装例

<<:  MySQLデータ内の多数の改行と復帰に対する解決策

>>:  Raspberry Pi 3B+ に 64 ビット Ubuntu システムと Docker ツールをインストールする詳細な手順

推薦する

nginx をシャットダウン/再起動/起動する方法

閉鎖サービス nginx 停止systemctl 停止 nginx起動するサービス nginx 開始...

HTML チュートリアル: よく使われる HTML タグのコレクション (6)

導入された HTML タグは、必ずしも XHTML 仕様に完全に準拠しているわけではありません。実際...

ページデザインにおけるテーブルとdivの適切な適用についての簡単な説明

この記事の冒頭で、以前書いた入門記事の間違いを訂正したいと思います。初心者を再び誤解させないように、...

MySQL Innodbインデックスの原理の詳細な説明

導入振り返ってみると、4年前、私がMySQLのインデックスについて学んでいたとき、先生はインデックス...

MySQL の複合インデックスはどのように機能しますか?

目次背景複合インデックスを理解する左端一致原則フィールド順序の影響複合インデックスは単一のインデック...

Vue.jsフレームワークはショッピングカート機能を実装します

この記事では、ショッピングカートを実装するためのVue.jsフレームワークの具体的なコードを参考まで...

MySQL マスタースレーブレプリケーションと読み取り書き込み分離の詳細な説明

目次序文1. 概要2. 読み取りと書き込みの分離3. MySQL マスタースレーブレプリケーションの...

Docker イメージの最適化 (1.16GB から 22.4MB)

目次最適化の第一歩: 軽量ベースイメージの使用第2段階の最適化:多段階構築Docker は、ソフトウ...

jQuery はピッカーをシミュレートしてスライド選択効果を実現します

この記事では、スライド選択効果を実現するピッカーをシミュレートするjQueryの具体的なコードを参考...

Vue でクラスとスタイルを使用して v-bind バインディングを使用するいくつかの方法

要素にクラスを追加/削除することは、プロジェクト開発では非常に一般的な動作です。たとえば、Web サ...

HTML+JS に基づくシンプルな年齢計算ツールの実装

目次序文デモンストレーション効果HTMLコードCSSコードJavascriptコードデモアドレス序文...

JavaScript関数の詳細な紹介

任意の数のステートメントを関数を通じてカプセル化することができ、いつでもどこでも呼び出して実行できま...

iframe テクニックを使用して訪問者 QQ 実装のアイデアとサンプル コードを取得する

今日、仕事中に、一時的に追加した友人から、Web ページを使用して訪問者の QQ を取得する方法を尋...

Vueはechart円グラフの凡例のパーセンテージを表示するメソッドを実装します

この記事では主に、echart を使用してパーセンテージを表示する Vue の円グラフデータ部分を紹...