序文ビジネスが発展し、機能が増えるにつれて、多くのページに類似した機能があることに気づきます。一般的な例として、複数選択のドロップダウン メニュー、入力用のダイアログ ボックス、日付ピッカーなどがあります。そこで、これらの共通機能を共通コンポーネントに抽出して、さまざまなページやビジネスで使用できるようにします。 テーブル コンポーネントをカプセル化する必要があるのはなぜですか?バックグラウンド管理システム内のテーブルは頻繁に使用されるため、テーブルに関するビジネス コードが削減され、後続の段階での統一された変更とメンテナンスが容易になります。たとえば、表の内容を表示する場合、省略記号を使用してセルの外側の内容を表示します。 ほとんどのバックエンド管理システムでは、データ テーブルの表示は似ています。重複したコードを書きたくないので、一般的なテーブル コンポーネントをカプセル化して手間を省くことにしました。テーブルにスイッチ ボタンなどの単純な 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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: VMware+centOS 8 で http プロトコルに基づく Git サービスを構築する方法
目次プロジェクトでデータベースを操作する3つのステップデータベースを操作するための具体的な手順1: ...
この記事の例では、vue ElementUI の非同期読み込みツリーを実装するための具体的なコードを...
1. Tclスクリプトファイルcircle.tclコードコメント #シミュレーションに必要なプロパテ...
選択して変更: クリックすると現在の値が表示され、ページ UI が表示され、CSS スタイルが変更さ...
MySQL 8.0.12 のダウンロードとインストールのチュートリアルを録画し、全員と共有しました。...
目次Vue CLIはVueプロジェクトを構築しますVue プロジェクトをマークダウン エディターに変...
リッチ テキスト コンポーネントは、Web プログラムで、特にブログやフォーラムなどの Web サイ...
MySQL ユーザーと権限MySQL には、MySQL と呼ばれるシステムに付属するデータベースがあ...
SVG は、さまざまな利点があるため、近年広く使用されています。残念ながら、WeChat ミニプログ...
1. 縦型テーブルと横型テーブル垂直テーブル: テーブル内のフィールドとフィールド値はキーと値の形式...
この記事では、MySQL 5.7.17ワークベンチのインストールと設定方法を参考までに紹介します。具...
目次要約する仕事の都合で Apple の Mac OS に対応するソフトウェアをインストールする必要...
序文簡単に言えば、tcpdump は、ネットワーク上のトラフィックをダンプし、ユーザーの定義に従って...
毎日jQueryプラグイン - 検索履歴を作成するためのものです。参考までに、具体的な内容は次のとお...
オンラインショッピングモールデータベース - 商品カテゴリデータ操作(I)プロジェクトの説明電子商取...