最近、新しいプロジェクトを開始し、独自のテーブル カプセル化について簡単に説明しました。 問題分析カプセル化の理由まず、なぜカプセル化するのでしょうか。それは技術の追求のためでしょうか。いいえ、怠惰のためです。コードを貼り付けたりコピーしたりし続けるのは嫌なので、テーブルをカプセル化したいのです。新しいテーブルを作成するときは、データを入力するだけで済みます。 パッケージの内容は何ですか?主なものは2つあり、1つはテーブルコンポーネント、もう1つはページングコンポーネントです。 これを理解したら、コンポーネントのパッケージ化を開始できます。 テーブルコンポーネントをカプセル化するデータ形式を確認するまずデータ形式を決定します。そのためにはel-tableコンポーネントを確認する必要があります。 <el-table :data="テーブルデータ" スタイル="幅: 100%"> <el-table-column prop="date" label="日付" width="180" /> <el-table-column fixed="right" label="操作" width="100"> <テンプレート スロット スコープ="スコープ"> <el-button @click="handleClick(scope.row)" type="text" size="small">表示</el-button> <el-button type="text" size="small">編集</el-button> </テンプレート> </el-table-column> </el-table> ここで、レベル、プロパティ、幅、ボタン タイプ、イベントなどのデータ タイプについて考えてみましょう。 パラメータタイプ = { data: 配列, // データの読み込み: ブール値, 選択表示: ブール値、 列:配列 = [ { ラベル: 文字列、 プロパティ: 文字列、 フィルター: 関数、 isSlot: ブール値、 幅: 数値、 テンプレート: 関数、 btns: 配列 = [ { 名前: 文字列, btnType: 文字列、 クリックタイプ: 文字列、 ルータータイプ: 文字列、 url: 文字列、 クエリ: 関数、 btnClick: 機能 } ] } ] } データドキュメントを定義したら、コンポーネントのカプセル化を開始できます。 パッケージコンポーネントグローバルコンポーネントのカプセル化グローバル コンポーネントをカプセル化する理由は、トラブルを回避し、怠惰にすることです。 src の下にコンポーネント ファイルを作成し、その中にコンポーネントを記述します。メンテナンスを容易にするために、各コンポーネントを別々のフォルダーに配置することをお勧めします。 独自の table.vue コンポーネントを作成します。私のコンポーネントは FrTable と呼ばれます。今は内容については話さず、まず参照についてお話ししましょう。 グローバル使用 FrTableファイルをコンポーネントの下のindex.jsファイルにインポートし、ここですべてのコンポーネントを走査してエクスポートします。 コードは次のとおりです。 './FrTable/index' から TrTable をインポートします。 const コンポーネント = [TrTable] const インストール = (Vue) => { コンポーネント.map(コンポーネント => { Vue.component(コンポーネント名、コンポーネント) }) } if (typeof Window !== 'undefined' && window.Vue) { インストール(Window.Vue) } エクスポートデフォルト{ インストール } 次にそれをmain.jsにエクスポートし、次のようにVue.use()を通じてコンポーネントを使用します。 '@/components/index' から globalComponents をインポートします。 Vue.use(グローバルコンポーネント) ページ内での使用 <fr-テーブル /> テーブルコンポーネントのカプセル化検討すべき質問 表にはケースがいくつありますか?
最初のタイプでは、実際にはあまり多くのことを行う必要はなく、 for ループを通じてレンダリングするだけです。 2番目は実際には大丈夫です。スロットでカスタマイズできます 3つ目はボタン操作です。ボタンは実際には多くの種類に分けられます ボタンの種類
コード記述 上記を通じて、テーブルのすべての問題を分析しました。あとはコードを入力するだけです。 最初のケース <el-table :data="データ" border :loading="読み込み中"> <!-- チェック --> <el-table-column v-if="selectionShow" type="selection" width="50" align="center" :reserve-selection="true" /> <template v-for="(item, index) 列内"> <el-table-column :key="index" v-bind="item"> <!-- カスタム ヘッダー --> <テンプレート v-if="item.customHeader" slot="ヘッダー"> <スロット:name="item.headerProp" /> </テンプレート> <テンプレート スロット スコープ="スコープ"> <span v-html="handleFilter(アイテム、スコープ行、アイテムプロパティ)" /> </テンプレート> </el-table-column> </テンプレート> </el-table> ここでhandleFilterメソッドを見てみましょう このメソッドはデータを処理します。 データ型は、通常のデータ型、変換が必要なデータ型、テンプレートによって変換されるデータ型に分けられます。 コードは次のとおりです ハンドルフィルター(アイテム、値、プロパティ) { 値 = val[prop]とする if (item.templet) 値 = item.templet(val) item.filter を返します? this.$options.filters[item.filter](val[prop]) : value }, 最初のケースは比較的単純で、単純なデータレンダリングとカスタマイズされたヘッダーレンダリングだけです。上記全体は、複数選択関数+通常の形式です。 2番目のケース カスタマイズされたリスト <テンプレート スロット スコープ="スコープ"> <!-- カスタムコンテンツ --> <スロット v-if="item.isSlot" :name="アイテム.prop" :row="スコープ.row"/ > </テンプレート> カスタムカテゴリの場合は、isSlotをtrue、nameをprop、rowをdataに設定するだけです。 3番目 3番目のボタンには4つの状況があります <テンプレート v-if="item.btns"> <el-ボタン v-for="(btn, i) が item.btns 内にあります" :key="i" クラス="mr_10" :size="btn.mini ? btn.mini: 'small'" :type="btn.type ? btn.type: 'プライマリ'" @click="btnClickfunc(btn, スコープ.行)" > {{ btn.name }} </el-button> </テンプレート> ボタンは実際にはループ内でレンダリングされ、主にイベント分析のために btnClickfunc イベントを通じて操作されます。 btnClickfunc(列、行) { 定数パス = { [column.routerType]: column.url, クエリ: column.query ? column.query(row): '' } (column.clickType === 'ルーター')の場合{ this.$router.push(パス) } そうでない場合 (column.clickType === 'router_blank') { const ルートデータ = this.$router.resolve(パス) window.open(routeData.href, '_blank') } そうでない場合 (column.clickType === 'btnClick') { column.btnClick(行) } それ以外 { this.$emit('btnClickFunc', { 列: 列、行: 行 }) } }, 当社では、製品の種類に応じて取り扱い方法が異なります。 小道具の価値 現在のパラメータは定義したパラメータと一致しているので、コードは次のようになります。 // データ: { タイプ: 配列、 必須: true }, // テーブルヘッダーパラメータ列: { タイプ: 配列、 必須: true }, 読み込み中: タイプ: ブール値、 デフォルト: false }, //複数選択ボックス選択表示: { タイプ: ブール値、 デフォルト: false }, これからは、コンポーネントをどのように使用するかだけが残ります。 コンポーネントの使用 <fr-テーブル ref="mt" :loading="読み込み中" :data="リスト" :columns="列" > </fr-table> 大体以下の通りです。複数選択が必要な場合は自分でメソッドを定義してください。並び替えも同様です。 ページングコンポーネントのカプセル化要素ページングコンポーネントを参照 <el-ページネーション スタイル="margin-top:40px;" 背景 レイアウト="前へ、ページャ、次へ" :page-size="ページ制限" :total="合計" :current-page="現在のページ" @current-change="現在の変更を処理する" /> 現在の変更を処理する(val) { コンソール.log(値) } データ定義定義は次のとおりです。 合計: 数、 ページ制限: 数値、 現在のページ: 番号、 カプセル化<el-ページネーション スタイル="margin-top:40px;" 背景 レイアウト="前へ、ページャ、次へ" :page-size="ページ制限" :total="合計" :current-page="現在のページ" @current-change="現在の変更を処理する" /> 現在の変更を処理する(val) { this.$emit('currentChange', val) } シンプルに見えますね。本当にシンプルです。 次に、ページング イベントとパラメーターをコンポーネントに追加して、テーブル全体のコンポーネントのカプセル化を完了します。これで、テーブル コンポーネント全体をカプセル化する作業はすべて完了しました。 要約するvue.js 管理背景テーブルコンポーネントのカプセル化に関するこの記事はこれで終わりです。より関連性の高い vue 背景テーブルカプセル化コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: VMware Workstation 15 Pro インストール ガイド (初心者向け)
>>: MySQLで自動作成時間と変更時間を設定する方法の例
この記事では主に、HTML+CSS で階層化ピラミッドを実装する例を紹介し、皆さんと共有します。詳細...
目次1. バックグラウンドで実行されるジョブ2. 信号を使用してプロセスを制御する基本的なプロセス管...
FIFO通信(先入れ先出し)関連のないプロセス間の通信を可能にする FIFO 名前付きパイプ。パイプ...
序文1. デバウンス: 高頻度イベントがトリガーされた後、関数は n 秒以内に 1 回だけ実行されま...
Nexus のデフォルトのリモートリポジトリは https://repo1.maven.org/ma...
CSSスタイルの分類1. 内部スタイル ---- インラインスタイルスタイルタグの使用 <ス...
この記事では、Docker を使用して MySQL をデプロイし、データを保持する方法について簡単に...
背景: 開発プロセスでは、現在の月、現在の日、現在の時間、今後数日など、時間を判断条件としてデータを...
/************************ * Linux メモリ管理 *********...
これまでに CSS の基本的なセレクターをいくつか学習しましたが、今日は CSS の複雑なセレクター...
1. 環境整備CentOS Linux リリース 7.5.1804 (コア)インストールフォルダを作...
1. 最近、Ubuntu の新しいバージョンをインストールしました。/etc/ssh/sshd_co...
Word of Mouth に入社して 3 ~ 4 か月が経ちました。仕事の中で一番の収穫は、ビジュ...
この記事の例では、簡単なショッピングカート機能を実現するためのjsの具体的なコードを参考までに共有し...
UNIONの使用ほとんどの SQL クエリは、1 つ以上のテーブルからデータを返す単一の SELEC...