要素 el-table テーブルの二次カプセル化 (テーブルの高さの調整付き)

要素 el-table テーブルの二次カプセル化 (テーブルの高さの調整付き)

序文

会社でのインターンシップ中、フロントエンド開発にはvue+element-uiフレームワークを使用し、el-tableテーブルの使用頻度が高まりました。業務ロジックが似通っている箇所や、繰り返しの多い箇所がありました。複数のページで同じ機能を使用する場合、論理的に似たコードを繰り返し記述する必要がありました。そこで、テーブルコンポーネントをカプセル化し、同じコードとロジックを一緒にカプセル化し、異なる業務ロジックを抽出することを計画しました。さっそく、実装してみましょう。

1. ネイティブ el-tbale コード - シンプルなカプセル化

ここでは公式の基本的な使用方法のテンプレートをそのまま引用してコピーします(✪ω✪)。次のコードは主にhtml部分を抽出しています。各el-table-columnにはprop、label、width属性が含まれていることがわかりますが、これらの属性値はわずかに異なります。残りの部分はほぼ同じなので、テーブルヘッダー(テーブルの各列のel-table-columnの定義)をここにカプセル化し、異なる場所を配列オブジェクト構造にカプセル化し、forループを通じてhtml部分を完成させます。

梱包前

 <テンプレート>
  <el-テーブル
   :data="テーブルデータ"
   スタイル="幅: 100%">
   <el-テーブル列
    プロパティ="日付"
    label="日付"
    幅="180">
   </el-table-column>
   <el-テーブル列
    プロパティ="名前"
    label="名前"
    幅="180">
   </el-table-column>
   <el-テーブル列
    prop="アドレス"
    label="住所">
   </el-table-column>
  </el-table>
 </テンプレート>

 <スクリプト>
  エクスポートデフォルト{
   データ() {
    戻る {
     テーブルデータ: [{
      日付: '2016-05-02'、
      名前: 王小湖、
      住所: '上海市普陀区金沙江路1518号'
     }, {
      日付: '2016-05-04'、
      名前: 王小湖、
      住所: '上海市普陀区金沙江路1517号'
     }, {
      日付: '2016-05-01'、
      名前: 王小湖、
      住所: '上海市普陀区金沙江路1519号'
     }, {
      日付: '2016-05-03'、
      名前: 王小湖、
      住所: '上海市普陀区金沙江路1516号'
     }]
    }
   }
  }
 </スクリプト>

テーブルの外観

梱包後

<テンプレート>
 <el-table :data="テーブルデータ" スタイル="幅: 100%">
  <template v-for="(item, key) in header">
   <el-テーブル列
    :key="キー"
    :prop="itm.prop ? itm.prop : null"
    :label="itm.label ? itm.label : null"
    :width="itm.width ? itm.width : null"
   >
   </el-table-column>
  </テンプレート>
 </el-table>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
 データ() {
  戻る {
   ヘッダー: [
    { プロパティ: "日付"、ラベル: "日付"、幅: "180" },
    { プロパティ: "名前"、ラベル: "名前"、幅: "180" },
    { プロパティ: "アドレス"、ラベル: "アドレス" }
   ]、
   テーブルデータ: [
    {
     日付: "2016-05-02",
     名前: 「王小湖」、
     住所:「上海市普陀区金沙江路1518号」
    },
    {
     日付: "2016-05-04",
     名前: 「王小湖」、
     住所:「上海市普陀区金沙江路1517号」
    },
    {
     日付: "2016-05-01",
     名前: 「王小湖」、
     住所:「上海市普陀区金沙江路1519号」
    },
    {
     日付: "2016-05-03",
     名前: 「王小湖」、
     住所:「上海市普陀区金沙江路1516号」
    }
   ]
  };
 }
};
</スクリプト>

今はまだデータが少ないので、カプセル化コンポーネントのカプセル化の利点は明らかではないかもしれませんが、以前のコードと比較すると、ここでのロジックはより明確に見え、列を変更するときに、HTML コードで「操作」することなく、データ内のヘッダーデータを直接変更できます ( ̄▽ ̄)/。上記は最も単純なカプセル化です。厳密に言えば、コード内のデータ構造を単純に抽出しただけです。通常のビジネスでは、このような単純なカプセル化以上のものがあるはずです。以下がキーポイントです─━ _ ─━✧

2. el-tbale コード - 複雑なカプセル化

: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

el-table リアル二次包装

二次パッケージソースコード

<テンプレート>
 <el-テーブル
  empty-text="まだデータがありません"
  ref="テーブル"
  :data="テーブルリスト"
  国境
  ストライプ
  フィット
  現在の行をハイライト
  :height="テーブル内高さ"
  @selection-change="選択変更"
  @row-click="行クリック"
 >
  <!-- ボックスを選択 -->
  <el-テーブル列
   v-if="選択"
   タイプ="選択"
   固定="左"
   幅="55"
   align="center"
  />
  <テンプレート v-for="(itm, idx) ヘッダー内">
   <!-- 特殊処理列 -->
   <el-テーブル列
    v-if="itm.render"
    :key="idx​​"
    :prop="itm.prop ? itm.prop : null"
    :label="itm.label ? itm.label : null"
    :width="itm.width ? itm.width : null"
    :sortable="itm.sortable ? itm.sortable : false"
    :align="itm.align ? itm.align : 'center'"
    :fixed="itm.fixed ? itm.fixed : null"
    :show-overflow-tooltip="itm.tooltip"
    最小幅="50"
   >
    <テンプレート スロット スコープ="スコープ">
     <ex-スロット
      :render="itm.render"
      :row="スコープ.行"
      :index="スコープ.$index"
      :column="itm"
     />
    </テンプレート>
   </el-table-column>
   <!-- 通常の列 -->
   <el-テーブル列
    v-else
    :key="idx​​"
    :prop="itm.prop ? itm.prop : null"
    :label="itm.label ? itm.label : null"
    :width="itm.width ? itm.width : null"
    :sortable="itm.sortable ? itm.sortable : false"
    :align="itm.align ? itm.align : 'center'"
    :fixed="itm.fixed ? itm.fixed : null"
    :formatter="itm.formatter"
    :show-overflow-tooltip="itm.tooltip"
    最小幅="50"
   />
  </テンプレート>
 </el-table>
</テンプレート>

<スクリプト>
// カスタムコンテンツ用のコンポーネント var exSlot = {
 機能的: 真、
 小道具: {
  行: オブジェクト、
  レンダリング: 関数、
  インデックス: 番号、
  カラム: {
   タイプ: オブジェクト、
   デフォルト: null
  }
 },
 レンダリング: (h, コンテキスト) => {
  定数パラメータ = {
   行: context.props.row、
   インデックス: context.props.index
  };
  context.props.column の場合、params.column は context.props.column になります。
  context.props.render(h, params) を返します。
 }
};

エクスポートデフォルト{
 コンポーネント: { exSlot },
 小道具: {
  テーブルリスト: {
   タイプ: 配列、
   デフォルト: () => []
  },
  ヘッダー: {
   タイプ: 配列、
   デフォルト: () => []
  },
  選択: {
   タイプ: ブール値、
   デフォルト: () => false
  },
  身長:
   タイプ: [数値、文字列、関数],
   デフォルト: () => null
  }
 },
 データ() {
  戻る {
   inTableHeight: null
  };
 },
 作成された() {
  // このステージは、親コンポーネントの渡されたパラメータを受け取ることができます。this.inTableHeight = this.height;
 },
 マウント() {
  this.$nextTick(() => {
   //テーブルの高さはブラウザのサイズに合わせて調整されます this.changeTableHight();
   if (!this.height) {
    ウィンドウのサイズ変更 = () => {
     テーブルの高さを変更します。
    };
   }
  });
 },
 破壊された() {
  // 高度に適応したイベントログアウト window.onresize = null;
 },
 時計:
  /**
   * データ変更後の適応性が高い */
  テーブルリスト() {
   this.$nextTick(() => {
    テーブルの高さを変更します。
   });
  }
 },
 メソッド: {
  /**
   * 選択ボックスを選択後、イベントの配信を変更 */
  選択変更(選択) {
   this.$emit("選択変更", 選択);
  },
  /**
   * クリックイベント */
  rowClick(行、列、イベント) {
   this.$emit("row-click", 行、列、イベント);
  },
  /**
   * 高さ調整可能* テーブルの表示スペースが460px未満の場合は460pxで表示されます。それより大きい場合は高さが埋められます*/
  テーブルの高さを変更する() {
   if (this.height) {
    // 高さが渡された場合は、適応をキャンセルします。this.inTableHeight = this.height;
    this.$refs.table.doLayout();
    戻る;
   }
   tableHeight を window.innerHeight || document.body.clientHeight とします。
   //高さの設定 let disTop = this.$refs.table.$el;
   // テーブルの上に要素がある場合は、ウィンドウに合わせてこれらの高さを減算します。66 は下の空白部分です。tableHeight -= disTop.offsetTop + 66;
   disTop.offsetParent の場合、テーブルの高さは disTop.offsetParent.offsetTop になります。
   this.inTableHeight = tableHeight < 460 ? 460 : tableHeight;
   //テーブルを再描画します this.$refs.table.doLayout();
  }
 }
};
</スクリプト>
<スタイル></スタイル>

梱包コードの説明

上記は私がカプセル化したコードです。一部のプロパティやメソッドは使用されていないため、対応するメソッドとプロパティをカプセル化していません。開発で対応する場所が必要な場合は、それらを埋めるだけです。テーブルをカプセル化したとき、互換性のためにここで三項演算子を使用しました。対応する属性が渡されない場合は、デフォルト値が与えられます。たとえば、align属性は、デフォルトで中央揃えになるように設定しました。メソッドもあります。表のメソッド参照に関して言えば、公式の方法は実際には$emitイベントを使用して、対応するパラメータとメソッド名を同様に親コンポーネントに配布することです。このようにして、親コンポーネントは要素の公式ドキュメントを参照してこれらのメソッドを使用できます。コンポーネント内で1回転送しただけです。自分で書いたときはあまり多くのメソッドを使用しなかったので、1つか2つだけカプセル化しました。必要に応じて自分で追加できます。上記 2 つのパッケージの他に、チェックボックスをループ内に配置できない特殊な場所があり、そうしないとエラーが発生します。インデックスの問題である可能性があるため、別のパラメータを使用して選択ボックスを表示するかどうかを制御します。さらに、同社の製品では、テーブルがページの高さに適応できることが求められます。この機能も長い間変更してきました。460 が最小の高さです。高さの適応に関するすべての情報は、changeTableHight() メソッドにあります。この機能が不要な場合は、この関数と、これを参照するすべての場所を削除するだけです。

height: この属性が渡されない場合、テーブルの高さは上記のように適応されます。この属性を使用して、テーブルの高さを指定できます。
formatter: 列でスロットが使用されている場合、このプロパティは無効になるため、2 つの列を設定しました。セルにコードを埋め込む必要があることを示すレンダリング メソッドがある場合は、特別な列が使用され、それ以外の場合は通常の列が使用されるため、formatter と render を同時に使用することはできません。

レンダリング: ようやく最も重要な部分に到達しました ( ̄▽ ̄)/。テーブルをカプセル化する上で、これが私にとって最大の難関です。私にとって、レンダリングは仮想ノードです。DOM ツリーと CSSOM ツリーがレンダリング ツリーにマージされると、コードが変更されます。

上記は、テーブルをカプセル化することについての私の詳細な説明です。いくつか省略されている部分があるかもしれません。結局のところ、このテーブルをカプセル化することで多くのことを学びましたので、いくつかの箇所は以前に明確に説明されていなかったり、適切に配置されていなかったりするかもしれません。訂正していただければ幸いです。

3. 親コンポーネントはカプセル化されたコンポーネントを参照する

もちろん、これだけ長い間カプセル化されたコンポーネントが役に立つかどうかは、使ってみて初めて分かります。参照に関しては、まず参照先にコンポーネントを登録する必要があります。グローバルに登録されていれば、ローカル登録は無視して構いません。ここではコンポーネントの登録については詳しく説明しません(o゚▽゚)o。グローバル登録を使用したので、ここでは独自のカプセル化されたコンポーネントを直接導入しました。

<テンプレート>
 <div class="hello">
  <xd-table :table-list="テーブルデータ" :header="ヘッダー" 高さ="300"></xd-table>
 </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
 名前: "HelloWorld",
 データ() {
  戻る {
   ヘッダー: [
    { プロパティ: "w"、ラベル: "w" },
    { プロパティ: "x", ラベル: "x",
     フォーマッタ: (行) => {
      row.x.toFixed(3) を返します。
     },
    },
    { プロパティ: "d", ラベル: "d",
     フォーマッタ: (行) => {
      row.d.toFixed(2) を返します。
     },
    },
    {
     ラベル: "操作",
     レンダリング: (h, データ) => {
      戻る (
       <el-ボタン
        タイプ="プライマリ"
        クリックすると{() => {
         this.handleClick(データ行);
        }}
       >
        クリックすると行データを取得できます</el-button>
      );
     },
    },
   ]、
   テーブルデータ: [
    { 幅: 1, x: 99.25123, 奥行き: 0.23892 },
    { 幅: 1, x: 255.6666, 奥行き: 0.99134 },
   ]、
  };
 },
 メソッド: {
  ハンドルクリック(行) {
   コンソールログ(行);
  },
 },
};
</スクリプト>

コンポーネントを参照する前に登録することを忘れないでください。ここではいくつかのプロパティのみを使用し、デモなので他のプロパティは使用しません。主な目的は埋め込みコードのレンダリング方法を示すことであり、もう 1 つは公式のフォーマッタ メソッドを使用することです。
注意が必要なのは、レンダリングで JSX テンプレート構文を使用していることです。ここでは、VUE プロジェクトで JSX 構文を別途設定する必要があります。JSX を使用したくない場合は、直接記述できます。JSX 構文を使用せずに記述された埋め込みテンプレートコードは読みにくいため、ここでは示しません。使用方法はネイティブ Vue と若干異なる箇所もありますが、個人的には JSX 構文を使用することをお勧めします。

エフェクトのスクリーンショット

結論

今回、Vue コンポーネントをカプセル化するのに、最初の連絡からバグの発見、そして修正まで、ほぼ半月かかりました。何度もやりとりした後、最終的にカプセル化を合理化して、この二次カプセル化コンポーネントに表示しました。おそらく、Vue と要素に精通している人にとっては、このカプセル化は実際には非常に簡単ですが、私にとっては、これはこのインターンシップ中にカプセル化したコンポーネントの中で、最も優れたコンポーネントの 1 つです。もちろん、このコンポーネントをカプセル化する以外にも、やるべきことがたくさんあります。会社の仕事を放棄することは私には不可能です (ハハハ︿( ̄︶ ̄)︿)。つまり、コンポーネントをカプセル化する過程で多くのことを学び、大きな進歩だったので、それを記録するためにブログを書こうと思います。

要素 el-table の二次パッケージ実装 (テーブルの高さ調整付き) に関するこの記事はこれで終わりです。要素 el-table の二次パッケージに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • vue+elementUI でのテーブルの強調表示またはフォント色の変更操作
  • element-ui テーブルのチェックボックスをオンにして現在の行を強調表示する詳細な説明
  • Vue+elementUIはテーブルキーワードのフィルタリングと強調表示を実現します
  • VUE2.0 ElementUI2.0 テーブル el-table 適応高さ実装方法
  • 要素テーブルヘッダー行の高さの問題の解決

<<:  CentOS7 (YUM) での MySQL 5.7 のインストールと設定のチュートリアル

>>:  Dockerfile を使用して nginx イメージを構築する例

推薦する

vite2.0 設定学習の詳しい説明(typescript 版)

導入悠宇希の原文です。 vite は Vue CLI に似ています。vite も、基本的なプロジェク...

CentOS7 64ビットインストールmysqlグラフィックチュートリアル

MySQL をインストールするための前提条件: CentOS 7 64 ビットをインストールし、Ce...

Vue3 でモバイル ログインおよび登録モジュールをエレガントに実装する方法

目次序文入力ボックスコンポーネントレイアウトvモデルデータ検証ルール設計形状サブコンポーネントは検証...

Alibaba Cloud Centos7.3 インストール mysql5.7.18 rpm インストール チュートリアル

MariaDBをアンインストールするCentOS7 ではデフォルトで MySQL の代わりに Mar...

Vue3 コンポジション API の紹介

目次概要例なぜそれが必要なのでしょうか?設定参照、反応的計算して見るライフサイクルVue3.0 は ...

CSS で 2 つの固定列と 1 つの適応列を実装するいくつかの方法

この記事では、CSS で 2 つの固定列と 1 つのアダプティブ列を実装するいくつかの方法を紹介し、...

ファイルが存在するかどうかを判断する JavaScript サンプルコード

1. ビジネスシナリオ最近はファイルのアップロードやダウンロードに関する開発をしています。ダウンロー...

MySQL バイナリログデータ復旧: 誤ってデータベースを削除した場合の詳細な説明

MySQL Binログデータの回復: 誤ってデータベースを削除した場合前書き: テスト マシンで誤っ...

Windows 10にWSL2 Ubuntu20.04をインストールしてdocker環境を構築する方法

WSLを有効にするシステムがWindows 10 2004以降であることを確認してください 「メニュ...

CSS3 のエラスティック レイアウトでの em の使用の概要: 1em は何ピクセルですか?

私は長い間 CSS を使用してきましたが、Web 要素の関連属性を設定するために常に「px」を使用し...

Angularコンポーネント投影の詳細な説明

目次概要1. 簡単な例1.サブコンポーネントの<ng-content>ディレクティブを使...

Vue は動的な円形のパーセンテージ進捗バーを実装します

最近、小さなプログラムを開発しているときに、次の設計図のような円形のパーセンテージ進捗状況バーを実装...

jsネイティブカルーセルプラグインの制作

この記事では、jsネイティブカルーセルプラグインの具体的なコードを参考までに共有します。具体的な内容...

CSS でフローティングにより親要素の高さが崩れる問題を解決するいくつかの方法

1. ドキュメントフローとフローティング1. ドキュメントフローとは何ですか? HTML では、ドキ...

nginx で同時接続リクエストの数を制限する方法

導入同時接続数を制限するモジュールは http_limit_conn_module です。アドレス:...