序文会社でのインターンシップ中、フロントエンド開発には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: この属性が渡されない場合、テーブルの高さは上記のように適応されます。この属性を使用して、テーブルの高さを指定できます。 レンダリング: ようやく最も重要な部分に到達しました ( ̄▽ ̄)/。テーブルをカプセル化する上で、これが私にとって最大の難関です。私にとって、レンダリングは仮想ノードです。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 つは公式のフォーマッタ メソッドを使用することです。 エフェクトのスクリーンショット結論今回、Vue コンポーネントをカプセル化するのに、最初の連絡からバグの発見、そして修正まで、ほぼ半月かかりました。何度もやりとりした後、最終的にカプセル化を合理化して、この二次カプセル化コンポーネントに表示しました。おそらく、Vue と要素に精通している人にとっては、このカプセル化は実際には非常に簡単ですが、私にとっては、これはこのインターンシップ中にカプセル化したコンポーネントの中で、最も優れたコンポーネントの 1 つです。もちろん、このコンポーネントをカプセル化する以外にも、やるべきことがたくさんあります。会社の仕事を放棄することは私には不可能です (ハハハ︿( ̄︶ ̄)︿)。つまり、コンポーネントをカプセル化する過程で多くのことを学び、大きな進歩だったので、それを記録するためにブログを書こうと思います。 要素 el-table の二次パッケージ実装 (テーブルの高さ調整付き) に関するこの記事はこれで終わりです。要素 el-table の二次パッケージに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: CentOS7 (YUM) での MySQL 5.7 のインストールと設定のチュートリアル
>>: Dockerfile を使用して nginx イメージを構築する例
日常の開発では、データベースの追加、削除、変更、クエリが一般的に行われるため、Mysql で NUL...
トランザクション ログには、関連するデータベースに対する操作が記録され、データベースの回復に関連する...
目次要件の説明問題の説明問題分析問題解決質問の拡張要件の説明このプロジェクトでは、まずユーザーが質問...
目次1. ミューテックス1. ミューテックスの初期化2. ミューテックスロックの関連特性と分類3. ...
目次文字列オブジェクトのメソッド方法 1: indexOf() (推奨)方法 2: search()...
display:flex、justify-content: space-betweend を設定する...
私は現在、Xiao Nian Gao に似たビデオおよびツール アプリを開発しています。ユーザーが作...
ツール型ウェブサイトについて、まず疑問に思うのは、無数のオンラインウェブサイトの中で、どのようなウェ...
ブラウザ (Web ドライバー) ベースの Selenium テクノロジを使用してデータをクロールす...
通常、すべての Web サイトは、多くの非検索エンジン クローラーに遭遇します。これらのクローラーの...
この記事では、セグメンター効果を実現するためのvue uniappの具体的なコードを参考までに共有し...
学習目標: parseInt() と Number() という 2 つの関数は、文字列をデータ型に変...
私はグレースケールの画像の方が芸術的に見えると思うので、いつもグレースケールの画像を好んで使っていま...
MySQL DDL ステートメントDDL、DMLとは何ですか。 DDL はデータ定義言語であり、CR...
時間が経つにつれて、多くの人が XHTML の使い方を知らないことに気づきました。普通の初心者だけで...