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アカデミー

推薦する

React+tsは二次リンク効果を実現します

この記事では、二次リンク効果を実現するためのReact+tsの具体的なコードを参考までに共有します。...

Vue はウェブページの言語切り替えの国際化を実装します

1. 基本的な手順1: yarn add vue-i18nをインストールするこのパスに新しい .js...

MySQL 8.0.23 無料インストールバージョンの設定詳細チュートリアル

最初のステップは、MySQL 8.0.23の無料インストールバージョンをダウンロードすることです。 ...

XHTML の IE 条件付きコメント

<br />条件付きコメントはIEシリーズ製品上でXHTMLコード処理を分離して行うこと...

Docker に Kong ゲートウェイをインストールする方法の例

1. Dockerネットワークを作成する docker ネットワーク作成 kong-net 2. デ...

ブラウザは関連するHTTPヘッダーをキャッシュし、HTTPリクエストの数を最小限に抑えます。

最近、Yahoo の 34 の黄金律を読み、ウェブサイトのパフォーマンスを最適化する方法を学びました...

Linux環境変数ファイルの簡単な紹介

Linux システムでは、環境変数は適用範囲に応じて、システムレベルの環境変数とユーザーレベルの環境...

MySQL可視化ツールNavicatへの接続方法

Navicatをインストールした後次のエラーが発生する場合があります: Client does no...

mysql8.0.18 で winx64 をインストールするための詳細なチュートリアル (画像とテキスト付き)

MySQLデータベースをダウンロードするには、https://dev.mysql.com/down...

電子署名を実装するWeChatミニプログラム

この記事では、WeChatミニプログラムで電子署名を実装するための具体的なコードを参考までに紹介しま...

LinuxでTomcatのポート番号を変更する方法

ここには複数の Tomcat があります。それらを同時に使用する場合は、ポート番号を別の番号に変更す...

DockerコンテナにRedisをデプロイする手順の紹介

目次1 つの Redis 設定ファイル2 Dockerコマンドの開始3 docker-compose...

SQLはLeetCodeを実装します(180.連続した数字)

[LeetCode] 180. 連続した数字少なくとも 3 回連続して出現するすべての数字を検索す...

Vue実戦記録のログインページの実装

目次1. 事前準備1.1 Node.jsをインストールする1.2 webpackをインストールする1...