一般的なテーブルコンポーネントの Vue カプセル化の完全な手順記録

一般的なテーブルコンポーネントの Vue カプセル化の完全な手順記録

序文

ビジネスが発展し、機能が増えるにつれて、多くのページに類似した機能があることに気づきます。一般的な例として、複数選択のドロップダウン メニュー、入力用のダイアログ ボックス、日付ピッカーなどがあります。そこで、これらの共通機能を共通コンポーネントに抽出して、さまざまなページやビジネスで使用できるようにします。

テーブル コンポーネントをカプセル化する必要があるのはなぜですか?

バックグラウンド管理システム内のテーブルは頻繁に使用されるため、テーブルに関するビジネス コードが削減され、後続の段階での統一された変更とメンテナンスが容易になります。たとえば、表の内容を表示する場合、省略記号を使用してセルの外側の内容を表示します。

ほとんどのバックエンド管理システムでは、データ テーブルの表示は似ています。重複したコードを書きたくないので、一般的なテーブル コンポーネントをカプセル化して手間を省くことにしました。テーブルにスイッチ ボタンなどの単純な DOM 要素ではない列がある場合は、レンダリング関数を渡して目的を達成できます。

ステップ1: 共通コンポーネントを定義する

<!-- pro-table.vue -->
<テンプレート>
  <div>
    <el-テーブル
      :data="テーブルデータ"
      スタイル="幅: 100%"
      :stripe="テーブルタイトル.stripe"
      :border="テーブルタイトル.border"
      :fit="テーブルタイトル.fit"
      :highlight-current-row="テーブルタイトル.highlightCurrentRow"
      @selection-change="ハンドル選択変更">
      <!--表の最初の列-->
      <el-テーブル列
        :type="firstTableCol.type"
        :width="最初の表の列の幅"
        v-if="firstTableCol.select"
      >
      </el-table-column>
      <!-- 表内の他の列 -->
      <el-table-column v-for="(value,index) in tableCol" :key="index"
                       :prop="値.prop"
                       :label="値.ラベル"
                       :width="値.幅 || 180">
        <テンプレート スロット スコープ="スコープ">
          <テンプレート v-if="!value.render">
            <テンプレート v-if="値.フォーマッタ">
              {{ value.formatter(scope.row, value) }}
            </テンプレート>
            <テンプレート v-else-if="value.getImgurl">
              <el-image :src="value.getImgurl(scope.row, value)" スタイル="幅: 70px; 高さ: 70px"
                        :preview-src-list="value.previewSrcList ? value.previewSrcList(scope.row, value) : value.getImgurl(scope.row, value).split(',')"/>
            </テンプレート>
            <テンプレート v-else>
              {{ スコープ.行[値.プロパティ] }}
            </テンプレート>
          </テンプレート>
          <!--拡張DOM-->
          <テンプレート v-else>
            <テーブル:key="`cus${index}`":render="value.render":param="scope.row"></テーブル>
          </テンプレート>
        </テンプレート>
      </el-table-column>
      <!--基本操作-->
      <el-table-column label="操作">
        <テンプレート スロット スコープ="スコープ">
          <el-button type="text" v-for="(value,index) in 演算子" @click="value.click(scope.row, value)" :key="index">
            {{ 値.テキスト }}
          </el-button>
        </テンプレート>
      </el-table-column>
    </el-table>
    <!--ページネーションプラグイン-->
    <el-ページネーション
      v-show="合計>0"
      :total="合計"
      :page-size.sync="ページサイズ"
      :current-page.sync="現在のページ"
      :ページサイズ="[10, 20, 30, 50]"
      layout="total, sizes, prev, pager, next, jumper"
      @current-change="現在の変更を処理する"
      @size-change="ハンドルサイズ変更"
      v-bind="$attrs">
    </el-pagination>
  </div>
</テンプレート>

<スクリプト>
// レンダリング関数 './table' から Table をインポート
エクスポートデフォルト{
  コンポーネント: {テーブル},
  小道具: {
    テーブルタイトル: {
      タイプ: オブジェクト、
      デフォルト: {
        ストライプ: 偽、
        境界: 偽、
        フィット: 真、
        現在の行をハイライト: false
      }
    },
    最初のテーブル列: {
      タイプ: オブジェクト、
      デフォルト: {
        選択: false、
        幅: 55,
        タイプ: '選択'
      }
    },
    テーブル列: {
      タイプ: 配列、
      デフォルト: []
    },
    テーブルデータ: {
      タイプ: 配列、
      デフォルト: []
    },
    オペレーター:
      タイプ: 配列、
      デフォルト: []
    },
    合計:
      タイプ: 数値、
      デフォルト: 0
    },
    ページ: {
      タイプ: 数値、
      デフォルト: 1
    },
    制限: {
      タイプ: 数値、
      デフォルト: 10
    },
    自動スクロール: {
      タイプ: ブール値、
      デフォルト: true
    }
  },
  計算: {
    現在のページ: {
      得る () {
        このページを返す
      },
      設定(値) {
        this.$emit('update:page', val)
      }
    },
    ページサイズ: {
      得る () {
        this.limitを返す
      },
      設定(値) {
        this.$emit('update:limit', val)
      }
    }
  },
  データ () {
    戻る {
    }
  },
  メソッド: {
    // テーブル選択ボックスをリッスンする handleSelectionChange (selection) {
      //親コンポーネントに対応するhandleSelectionChangeメソッドを呼び出す
      this.$emit('handleSelectionChange', 選択)
    },
    // ページごとに監視するレコード数(制限)
    ハンドルサイズ変更 (制限) {
      this.$emit('ページネーション', {ページ: this.currentPage, 制限: limit})
      (this.autoScroll)の場合{
        スクロール(0, 800)
      }
    },
    // 現在のページを監視する (ページ)
    handleCurrentChange (ページ) {
      this.$emit('pagination', {page: page, limit: this.pageSize})
      (this.autoScroll)の場合{
        スクロール(0, 800)
      }
    }
  }
}
</スクリプト>
<スタイルスコープ>
</スタイル>

ステップ2: 親コンポーネントと子コンポーネント間の通信をレンダリングする

親コンポーネントのレンダリング関数を子コンポーネントで有効にするには、レンダリング関数を定義し、子コンポーネントでそれを参照する必要があります。

// テーブル.js
エクスポートデフォルト{
  小道具: {
    与える: {
      タイプ: 関数
    },
    パラメータ: {
      タイプ: オブジェクト
    }
  },
  レンダリング(h) {
    this.render(h, this.param) を返します。
  }
}

ステップ3: コンポーネントの使用

<テンプレート>
  <div>
    <!--
        @Custom event="親コンポーネントメソッド"、子コンポーネントでは、this.$emit('カスタムイベント名') が親コンポーネントイベントをトリガーします。
        ref="proTable"、サブコンポーネントにマークされ、サブコンポーネントインスタンスを指します -->
    <proTable ref="proTable" :tableTitle="テーブルタイトル" :tableCol="テーブル列" :tableData="テーブルデータ" :operator="演算子"
        :firstTableCol="最初のテーブル列"
        @handleSelectionChange="ハンドル選択変更"
        :total="合計" :page.sync="queryParams.page" :limit.sync="queryParams.limit" @pagination="getList"/>

  </div>
</テンプレート>

<スクリプト>
'./pro-table' から proTable をインポートします。

エクスポートデフォルト{
  コンポーネント:
    プロテーブル
  },
  データ() {
    戻る {
      クエリパラメータ: {
        ページ: 1,
        制限: 10,
      },
      タイプ: '成功'、
      合計: 50,
      // element-ui tableTitle でテーブル属性を設定する: {
        'ストライプ': true、
        "現在の行をハイライト": true
      },
      // テーブル列を設定する tableCol: [
        { プロパティ: '日付'、ラベル: '日付'},
        { プロパティ: '名前', ラベル: '名前'},
        { prop:'address',label:'住所',width: 300},
        { prop:'src',label:'画像',  
        getImgurl: (行、列、セル値) => { this.getImgurl(行) を返します}, 
        previewSrcList: (行、列、セル値) => {this.listImgUrl(行) を返します}},
        { prop:'sex', label:'性別',  
        フォーマッタ: (row, col, cellValue) => {return this.sexFormatter(row)}},
        { prop:'src',label:'画像',  
        getImgurl: (行、列、セル値) => { this.getImgurl(行) を返します}},
        { prop:'text',label:'function', render: (h, params) => {return this.render(h, params)}}
      ]、
      // 基本的なテーブル操作演算子: [
        {'text':'詳細'、クリック: (row, col, cellValue) => {return this.getInfo(row)}},
        {'text':'削除'、クリック: (row, col, cellValue) => {return this.delInfo(row)}}、
        {'text':'編集'、クリック: (row, col, cellValue) => {return this.editInfo(row)}}、
      ]、
      // シミュレーションデータテーブルデータ: [
        {
          日付: '2016-05-02'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1518号'、
          性別: 0,
          画像:'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic2.zhimg.com%2F50%2Fv2-193cbb243dc14d3a016caaa54ba02837_hd.jpg&refer=http%3A%2F%2Fpic2.zhimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1628435704&t=deb5584cb9ff53fe6977f14a5e0755bb'
        }, {
          日付: '2016-05-04'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1517号'、
          性別: 1,
          画像:'https://pic1.zhimg.com/80/v2-894ab624807fd4cfa33dd4e42cc90ac8_720w.jpg?source=1940ef5c'
        }, {
          日付: '2016-05-01'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1519号'、
          性別: 0,
          画像:'xx.jpg'
        }, {
          日付: '2016-05-03'、
          名前: 王小湖、
          住所: '上海市普陀区金沙江路1516号'、
          性別: 1,
          画像:'xx.jpg'
        }],
      最初のテーブル列: {
        '選択': 真、
        'タイプ': '選択'
      }
    }
  },
  メソッド: {
    getInfo(val) {
      // 親メソッドをトリガーします console.log("詳細を取得",val)
    },
    delInfo(値) {
      // 親メソッドをトリガーします console.log("delete information",val)
    },
    編集情報(val) {
      // 親メソッドをトリガー console.log("編集情報",val)
    },
    getImgurl(val) {
      コンソールログ(val.img)
      val.img を返す
    },
    セックスフォーマッタ(val) {
      val.sex === 0 を返します? '男性' : '女性'
    },
    選択変更処理(val) {
      console.log("選択ボックスを聴く",val)
    },
    getList(クエリパラメータ) {
      console.log("親メソッド",queryParams)
    },
    リストImgUrl() {
      配列 = [] とします。
      配列.push("https://pic1.zhimg.com/80/v2-894ab624807fd4cfa33dd4e42cc90ac8_720w.jpg?source=1940ef5c");
      配列.push("https://cdn.pixabay.com/photo/2021/07/01/21/20/girl-6380331_960_720.jpg");
      配列を返します。
    },
    レンダリング(h, パラメータ) {
      h('span', null, '私はレンダリングコンポーネントです') を返します
    }
  }
}
</スクリプト>

要約する

コンポーネントを参照するページでは、各テーブル列にメソッドを追加できるほか、編集、削除、詳細などのカスタム メソッドを追加して、完全なカスタマイズを実現することもできます。レンダリング機能をカスタマイズすることもできます。効果図は以下のとおりです。

ユニバーサル テーブル コンポーネントの Vue カプセル化に関するこの記事はこれで終わりです。ユニバーサル テーブル コンポーネントの Vue カプセル化に関するより関連性の高い記事については、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue elementuiは、検索バーのパブリックコンポーネントのカプセル化のサンプルコードを実装します。
  • vue element-ui で独自のコンポーネントをカプセル化する方法の詳細な説明
  • Vue のスロットの使用法と適用シナリオの詳細な分析
  • vue スロットを使用して vue で共通コンポーネントをカプセル化する方法

<<:  MySQL トリガーの定義と使用方法の簡単な例

>>:  VMware+centOS 8 で http プロトコルに基づく Git サービスを構築する方法

推薦する

HTMLの水平線注釈とコードコメントの使い方をマスターするだけです

水平線<hr /> タグを使用して、現在の位置に水平の分割線を描画します。例: XML/...

Vue2.0でデータの双方向バインディング機能をjsを使って実装する

Object.definePropertyの理解文法:オブジェクト.defineProperty(o...

vue+element で動的スキニングを実装するためのサンプルコード

プロジェクトのテーマがすべての人の美的感覚を満足できないこともあります。このとき、スキン変更機能は非...

Vue ページでよりエレガントに画像を紹介する方法

目次エラーのデモンストレーション計算により画像が変わらない場合は直接インポートするCSS変数による画...

Zabbixで指定時間内の変化値を設定する方法の詳細な説明

背景説明: 既存の負荷分散装置には、付加価値状態にある指標があります (増加するだけで減少しないため...

MySQL Strict Modeの知識ポイントの詳細な説明

I. 厳密モードの説明MySQL 5.0 以降の厳密モード (STRICT_TRANS_TABLES...

Vueは左上と右上のスライドナビゲーションを実装します

ナビゲーションなどは日々の開発でよく使うので、記録として記事を書きます。ナビゲーションは終了/開始位...

MySQL サービスを完全に削除する方法 (レジストリをクリーンアップする)

序文あるプロジェクトの実行可能ファイルをインストールすると、MySQL 自体をインストールできるよう...

HTML テーブル マークアップ チュートリアル (41): テーブル ヘッダーの幅と高さの属性 WIDTH、HEIGHT

デフォルトでは、ヘッダーの幅と高さはコンテンツに応じて自動的に調整されます。ヘッダーの幅と高さを手動...

MySQL でストリーミングクエリを使用してデータ OOM を回避する

目次1. はじめに2. JDBCはストリーミングクエリを実装する3. パフォーマンステスト3.1. ...

上部の固定ナビゲーションバーによって CSS アンカーの配置がブロックされる問題の解決方法

多くのウェブサイトでは、ユーザーが簡単に検索したり他のページに移動したりできるように、上部にナビゲー...

位置固定オフセット問題を解決する方法の詳細な説明

質問CSS 固定配置の position:fixed は非常に使いやすいです。ブラウザのビューポート...

Vue Element Sortablejs を使用してテーブル列をドラッグする詳細な説明

1. css: ドラッグテーブル.css @charset "UTF-8"; ....

Layuiはログインインターフェース検証コードを実装します

この記事の例では、ログインインターフェース検証コードを実装するためのlayuiの具体的なコードを参考...

JavaScript で実装された 6 つの Web ページ画像カルーセル効果の詳細な説明

目次1. マウスがカルーセル モジュール上を通過すると、左右のボタンが表示され、モジュールを離れると...