vue+el-element でファイル名に応じてダイアログを動的に作成する実践

vue+el-element でファイル名に応じてダイアログを動的に作成する実践

背景

プロジェクトでダイアログ ボックスを使用する一般的な方法は、ダイアログ ボックスをコンポーネントにカプセル化し、使用する場所にインポートしてテンプレートに追加し、visible.sync を使用してダイアログ ボックスの表示/非表示を制御し、確認イベントをリッスンしてユーザーの [OK] クリックを処理することです。次のように:

 <確認ダイアログ
     v-if="確認ダイアログ表示"
     :title="$t(`mineData.tips.deleteDataset`)"
     :visible.sync="ダイアログの表示を確認"
     @confirm="確認ハンドラー"
 </確認ダイアログ>

カプセル化されたダイアログでは、閉じるときに表示を更新し、確認時に確認イベントをトリガーする必要もあります。

 メソッド: {
    近い() {
        this.$emit("update:visible", false);
    },
    確認する() {
        これを閉じます。
        this.$emit("確認");
    }
}

このアプローチでは、ページの初期化時にすべてのダイアログ コンポーネントが導入されるため、読み込み速度に影響するだけでなく、ページに多くのダイアログ ボックスが導入されると多くの問題が発生し、ページが非常に乱雑になります。ダイアログ ボックスごとに HTML のセクションを挿入し、ダイアログ ボックスごとに個別の表示変数を維持し、ダイアログ ボックスごとに確認イベント リスナーを追加する必要があります...

これらの操作のほとんどはビジネスとは無関係であり、非常に似ています。

では、js を通じてダイアログを動的に作成する方法はあるのでしょうか?

ダイアログを作成します("confirm-dialog.vue");

上記と同様に、visible を定義したり、HTML やイベント コールバックを多数追加したりすることなく、ファイル名に応じてダイアログ ボックスを開くことができます。また、最初にダイアログ コンポーネントを導入する必要もありません。

簡単じゃないですか!興奮していますか?読み続けてください。

成し遂げる

1. カプセル化された /utils/dialogControl.js

'vue' から Vue をインポートします
非同期関数createDialog(ファイル名、データ){
  const ダイアログコンテキスト = require.context(
    '../components', // 検索ファイルの範囲を定義します true,
    /([a-zA-Z\-0-9]+)\.vue$/, // ファイル名ルール 'lazy' を定義する
  )
  // 渡された名前のファイルを検索してロードします。let match = dialogsContext.keys().find((key) => key.includes(fileName))
  if (!match) を返す
  コンポーネントコンテキストをawait dialogsContext(match) にします。
  temp = componentContext.default とします
  新しいPromise(function(resolve,reject))を返す{
    // 設定パラメータを初期化する let opt ​​= {
      データ
    }
    コンポーネントをObject.assign({}, temp)とします。
    initData = {
      表示: true
    }
    オブジェクトにデータを割り当てます。
    opt.data && Object.assign(initData, JSON.parse(JSON.stringify(opt.data)))
    コンポーネント.データ = 関数 () {
      initDataを返す
    }
    // インスタンスを作成してマウントするためのコンストラクタを作成します。let DialogC = Vue.extend(component)
    ダイアログを新しいDialogC()にします
    // 閉じるイベント let _onClose = dialog.$options.methods.onClose
    ダイアログ.onClose = 関数 () {
      解決する()
      ダイアログ.$destroy()
      _onClose && _onClose.call(ダイアログ)
      document.body.removeChild(ダイアログ.$el)
    }
    // コールバックイベント let _onCallback = dialog.$options.methods.onCallback
    dialog.onCallback = 関数 (...引数) {
      試す {
        _onCallback && _onCallback()
        解決(引数)
        ダイアログ.$destroy()
        _onClose && _onClose.call(ダイアログ)
        document.body.removeChild(ダイアログ.$el)
      } キャッチ (e) {
        コンソール.log(e)
      }
    }
    ダイアログ.$mount()
    // 閉じるボタンをクリックすると表示が変わります
    ダイアログ.$watch('visible', 関数(n, o) {
      ダイアログ === false && dialog.onClose()
    })
    document.body.appendChild(ダイアログ.$el)
  })
}

エクスポート {createDialog}

例:
1. ファイルを検索するパスと名前に一致する正規表現を指定する必要があります。これにより、不要なファイルを除外できます。

2. 開くダイアログファイルに一致するfileNameパラメータを受け取り、dataパラメータはダイアログ ボックスに渡されるデータであり、コンポーネントのデータにマージされます。

3. 可視変数を使用してダイアログボックスの表示/非表示を制御する

4.ダイアログボックスを閉じるonCloseメソッドを定義します。これを使用してダイアログボックスを閉じることができます。

5. onCallbackメソッドは、OKボタンをクリックしたときに親コンポーネントに値を渡すなど、ダイアログボックスを呼び出す親コンポーネントに値を渡すために使用されます。

2.ダイアログファイルの定義

たとえば、/components/ConfirmDialog.vue では、visible 変数は表示/非表示を制御するために使用され、onClose は閉じるイベントを処理し、確認ボタンのコールバックは onCallback です (これは dialogControl.js の定義と一致しています)。

<テンプレート>
    <el-dialog title="プロンプト" :visible.sync="visible" width="30%">
        <span>Lorem、ipsum dolor sit amet consectetur adipisicing elit。Nesciunt quis
            perspiciatis fugiat molestiae provident accusantium repudiandae fugit について
            ミニマ、イーク、リペラト キブスダム イステ セッド 広告? デビティス クイ プレセンティウム
            マイナスインシデントエッセ!
        <span slot="フッター" class="ダイアログフッター">
            <el-button @click="onClose">キャンセル</el-button>
            <el-button type="primary" @click="onCallback(true)">OK</el-button>
        </span>
    </el-ダイアログ>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  データ () {
    戻る {}
  },
  メソッド: {
  }}
</スクリプト>

3. 使用

dialogControl に createDialog メソッドを導入し、ファイル名を直接渡して開きます。

他の属性がある場合は、キーと値のペアの形式で 2 番目のパラメータに入力します。これらの属性はダイアログ コンポーネントのデータにマージされるため、ダイアログ コンポーネントで直接使用できます。

createDialog メソッドは promise オブジェクトを取得し、その then メソッドは confirm によって返された結果を取得できます。

<テンプレート>
  <div>
    <h1>これはショーページです</h1>
    <el-button type="primary" @click="openDialog">開く</el-button>
  </div>
</テンプレート>

<スクリプト>
「@/utils/dialogControl」から createDialog をインポートします。
エクスポートデフォルト{
  メソッド: {
    オープンダイアログ() {
      ダイアログを createDialog("confirm-dialog.vue");
      ダイアログ.then((v) => {
        もし(動詞){
          console.info("OK");
        }
      });
    },
  },
};
</スクリプト>

効果は以下のとおりです。

この記事の冒頭にある方法を使用してダイアログ ボックスを呼び出している場合は、急いでこの方法を使用してください。

参照:

https://www.freesion.com/article/43311065748/

vue+el-element でファイル名に基づいてダイアログを動的に作成する実践についての記事はこれで終わりです。el-element によるダイアログ コンテンツの動的作成に関するより関連性の高い記事については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • vue+element-ui プロジェクトでダイアログ コンポーネントをカプセル化する方法の詳細な説明
  • ElementUIは同じページに複数のダイアログを表示します
  • element-ui でダイアログ ポップアップ ウィンドウを閉じることができない問題の解決方法
  • 要素ダイアログの使用例
  • 要素UIでダイアログを閉じた後に検証条件をクリアする方法
  • 要素 ui ダイアログボックス el-dialog 終了イベントの詳細な説明

<<:  CentOS 7.6 仮想ネットワーク カードのバッチ追加、変更、削除操作の紹介

>>:  HTMLフレームワーク_Powernode Javaアカデミー

推薦する

MySQL Innodbインデックスの原理の詳細な説明

導入振り返ってみると、4年前、私がMySQLのインデックスについて学んでいたとき、先生はインデックス...

MySql ストレージ エンジンとインデックスに関する知識のまとめ

ストレージエンジンデータベース ストレージ エンジンとは何ですか?データベース エンジンは、データベ...

MySql5.7.18 の文字セット構成の詳細なグラフィック説明

背景:かなり前(2017.6.5、記事にはタイムリーさがあり、特に使用されているツールは頻繁に更新さ...

Dockerは1行のコマンドでFTPサービス構築の実装を完了します

1行のコマンド docker run -d \ -v /share:/home/vsftpd \ -...

Linuxシステムの入出力管理とvimの共通機能の詳細な説明

####システム内の入出力の管理#### 1. システムの入力と出力のリダイレクトを理解する入力リダ...

MySQL関数の簡単な紹介

目次1. 数学関数2. 文字列関数3. 日付関数4. 暗号化機能主な MySQL 関数は次のように紹...

16 の XHTML1.0 と HTML の互換性ガイドラインの概要

1.ページを XML タイプとして宣言しないでください。ページでは UTF-8 または UTF-16...

シンプルな商品スクリーニング機能を実現するjs

この記事の例では、商品スクリーニング機能を実装するためのjsの具体的なコードを参考までに共有していま...

JavaScript は大容量ファイルのアップロード処理を実装します

数十 MB 程度の小さいものから 1G 以上の大きいものまで、ビデオ ファイルなどのファイルのアップ...

CSS3はグラフィックの落下アニメーション効果を実現します

まずは効果を確認実装コード <div class="box box1"&g...

VMware に Centos8 をインストールする詳細なチュートリアル

CentOS公式サイトアドレスhttps://www.centos.org/まず必要なファイルをダウ...

Tinymce リッチテキストを使用して Vue のツールバーボタンをカスタマイズする実践

目次tinymce、tinymce ts、tinymce-vue 宣言ファイルをインストールするパッ...

シンプルなドラッグ効果を実現するJavaScript

この記事では、簡単なドラッグ効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

MySQL 制約の超詳細な説明

目次MySQL 制約操作1. 非ヌル制約2. ユニーク制約3. 主キー制約4. 外部キー制約5. カ...

MySQLの外部ネットワークアクセス権を開く方法

以下のように表示されます。主に認証コマンドを実行します: 2つの方法1. 任意のホストがユーザー b...