要素 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 イメージを構築する例

推薦する

JS正規RegExpオブジェクトについての簡単な説明

目次1. RegExpオブジェクト2. 文法2.1 定義2.2 修飾子2.3 角括弧2.4 メタ文字...

spring-boot と docker-java に基づいて Docker コンテナの動的な管理と監視を実装します [完全なソース コードのダウンロード付き]

Docker入門Docker はオープンソースのアプリケーション コンテナ エンジンです。従来の仮...

MySQL 8.0.21.0 コミュニティ エディションのインストール チュートリアル (詳細な図解)

1. MySQLをダウンロードするMySQL 公式 Web サイトにログインし、MSI インストー...

フォーム入力ボックスに関するWebデザインのヒント

この記事では、Web デザインにおけるフォーム入力ボックスに関するヒントとコードをいくつか紹介します...

Nginx プロセス スケジューリングの問題の詳細な説明

Nginx は、マスター プロセス (MasterProcess) と、同じ数のホスト CPU コア...

IE ラベル LI テキスト折り返し問題について

私は長い間この問題に悩まされていましたが、検索してみたところ、実際にこの問題を解決した人がいることが...

シンプルなスネークゲームを実現するネイティブjs

この記事では、スネークゲームを実装するためのjsの具体的なコードを参考までに共有します。具体的な内容...

HTML ハイパーリンク タグ_Powernode Java アカデミー

HTML を学習したり使用したりしたことがある人なら、<a> タグについてよく知っている...

HTML5+CSS3 ヘッダー作成例と更新

前回、私たちは 2 つのヘッダー レイアウト (フレックスボックス 1 つとフロート 1 つ) を考...

NodeはMySQLに接続し、追加、削除、変更、チェックのための実装コードをカプセル化します。

目次ノードはMysqlに接続しますMySQLモジュールをインストールするMySQLに接続するよく使わ...

CSSをiPhoneのフルスクリーンに適応させる方法

1. メディアクエリ方式 /*iPhone X への適応*/ @media 画面のみ、(デバイス幅:...

MycliはMySQLコマンドライン愛好家にとって必須のツールです

マイクリMyCLI は、自動補完と構文の強調表示を備えた MySQL、MariaDB、および Per...

Vue コードの読みやすさに関するいくつかの提案

目次1. コンポーネントをうまく活用してコードを整理する1. UIコンポーネントを抽出する2. モジ...

nginx keepaliveの具体的な使い方

http1.1 プロトコルのデフォルトのリクエスト ヘッダーでは、図に示すように、デフォルトで ke...

VUE+SpringBootはページング機能を実装します

この記事では主に、Vue + SpringBoot でページ分割されたリストデータを実装する方法を紹...