Vue3 を使用してポップアップ コンポーネントをカプセル化するのは簡単ですか?

Vue3 を使用してポップアップ コンポーネントをカプセル化するのは簡単ですか?

最初に要約:

ヒント: カプセル化されたポップアップ コンポーネントは、コンポーネントのネストによって発生する可能性のある配置階層の隠れた危険を回避するために Teleport を使用します。また、defineProps、defineEmits、およびスロットを使用して、コンポーネントの拡張性を高めます。

🌲🌲 序文:

これまで自分でポップアップ ウィンドウ コンポーネントをカプセル化したことはありませんが、小さなポップアップ ウィンドウ コンポーネントでも決して小さな問題ではないと思います。そして今日、新しいプロジェクトでポップアップ コンポーネントが必要になったので、それを作成しました。やらなくても問題ありません。一度やってみれば、まだまだ小さな問題がたくさんあることに気づき、遭遇した問題を大企業と共有するのです。

まず、世界的に使用されるパブリック ポップアップ ウィンドウ コンポーネントの要件を確認しましょう。次に、パブリック、グローバル、ポップアップウィンドウといういくつかの重要なポイントがあります。これらの重要なポイントに基づいて、ポップアップウィンドウコンポーネントを少しずつ実装してみましょう。

🍬🍬公開🍬🍬

これは非常に簡単です。ここにいる大物たちなら誰でも簡単にできると思います。

まずメインコンテンツを実装します。私の方法は、スロットとパラメータの受け渡しを使用することです。この例では、タイトル コンテンツと、オンかオフかを制御するブール値の 2 つのパラメーターを渡すだけです。主に、defineProps、defineEmits、slots という 2 つの Vue3 API を使用します。

<テンプレート>
    <Mask @click="close" /> // マスクレイヤー <div class="modal_all" v-if="visible">
        <slot name="header"> // ページにカスタムヘッダーを追加するのに便利です<div class="modal_header">
                <p class="modal_header_title">{{ タイトル }}</p>
                <p class="modal_header_img" @click="閉じる"></p>
            </div>
        </スロット>
        <div class="modal_content">
            <slot></slot> //ポップアップコンテンツを開く</div>
    </div>
</テンプレート>
<script lang="ts" セットアップ>
定義プロパティ({
    見える:
        タイプ: ブール値、
        デフォルト: false、
    },
    タイトル:
        タイプ: 文字列、
    },
});
const 出力 = defineEmits(['update:visible']);
定数close = () => {
    出力('update:visible', false);
};
</スクリプト>
// スタイル省略

🍬🍬グローバル🍬🍬

基本的なレイアウトはほぼ完了しており、次はグローバル登録です。目的は、使用するたびに導入する必要がないようにすることです。

vue2 でグローバル コンポーネントを登録する場合は、Vue.component('name', component) を使用するだけです。では、vue3 でグローバル コンポーネントをバッチで登録するにはどうすればよいでしょうか? app.use() を使用して自動的に呼び出されるインストール メソッドを提供します。

'./Modal/Modal.vue' から Modal をインポートします。
'./Modal/Mask.vue' からマスクをインポートします。

// スクリプト設定で名前を書くことはできないので、const coms = [ を追加します。
  {
    name: 'Modal', // コンポーネント名を使用します compent: Modal,
  },
  {
    名前: 'マスク'、
    コンポーネント: マスク、
  },
];

エクスポートデフォルト{
  インストール: (アプリ) => {
    coms.forEach((アイテム) => {
      app.component(アイテム名、アイテムコンポーネント);
    });
  },
};

//メイン.ts
'./common/index' から Common をインポートします。
const app = createApp(App);
app.use(共通);

🍬🍬ボールボックス🍬🍬

実際、ポップアップ ウィンドウ コンポーネントはここに記述されているので、ポップアップ ウィンドウを別途リストする必要があるのはなぜでしょうか?

皆さんも日々の業務で配置や階層の問題に遭遇したことがあると思います。配置が必要なコンポーネントを Vue コンポーネント内にネストすると、CSS のさまざまなレイヤーにより、ネストされた配置、階層、スタイルを処理するのが非常に難しくなります。注意しないと、奇妙な問題が発生します。では、この問題を回避するにはどうすればよいでしょうか。次に、Vue3 の別のポータル API、Teleport を使用します。

ヒント: テレポートは、ポータルと同様に、属性に対応する DOM 要素にコンポーネントをマウントします。

まずコード:

<teleport to="#mask_modal" v-if="visible">
    <div class="modal_cent">
        <マスク @click="閉じる" />
            <div class="modal_all">
                <スロット名="ヘッダー">
                    <div class="header">
                        <p class="header_title">{{ タイトル }}</p>
                        <p class="header_img" @click="閉じる"></p>
                    </div>
                </スロット>
            <div>
            <スロット></スロット>
            </div>
        </div>
    </div>
</テレポート>

これを書いた後の階層を見てみましょう:

to 属性を使用して、箇条書きボックス コンポーネントのレンダリングの位置がレイアウト コンポーネントと同じレベルになるように指定しますが、テレポートの表示ステータスは、呼び出すコンポーネントによって完全に制御されるため、コンポーネントをネストするときに階層スタイルの配置に関する問題を回避できます。

🌼🌼 これまでのところ、シンプルなパブリック ポップアップ コンポーネントがほぼ作成されました。その後、このコンポーネントを作成する過程で、問題とは見なされていなかったいくつかの問題に遭遇しました 😅。

❗️❗️❗️1. スクリプト設定では name 属性を書き込むことはできません。

ts を使用しない場合は、別のスクリプトタグを記述してエクスポートし、名前を記述することもできます。 ts を使用すると、このメソッドは機能せず、エラーが報告されます。次に、上で書いた方法を使用して、自分で再定義し、オブジェクトを記述します。

❗️❗️❗️2. グローバル コンポーネントにクラスとスタイルを直接追加しても機能しません。

実は、通常、パブリック コンポーネントを作成するときに、内部コンテナーのスタイルを、それが使用される外側のレイヤーで直接制御したい場合は、外側にクラス名を直接追加してスタイルを高めることができます。 しかし、このポップアップ コンポーネントを作成していたとき、それが機能しませんでした。長い間検索した後、テレポートを使用したため、解析時にクラスを継承できなかったことが原因であることがわかりました。コンポーネントにルート コンポーネントがない場合も、同じ問題が発生します。これは実際には問題ではありません。スロットにコンテンツを書き込むだけで、自動的に拡張されます。皆さんは私のような愚かな操作を行わないと信じています(笑)。

🎉🎉🎉結論:

実際、ポップアップ コンポーネントのカプセル化はまだ非常に単純ですが、ある程度の経験を積み、独自のプロジェクトを実装したものと見なすことができます。後でより複雑なコンポーネントをカプセル化するのが簡単になります。

これで、Vue3 を使用してポップアップ ウィンドウ コンポーネントをカプセル化する方法についての記事は終了です。Vue3 でカプセル化されたポップアップ ウィンドウ コンポーネントに関する関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue3.0 ベースの軽量モバイル ポップアップ コンポーネント V3Popup の開発シナリオ分析
  • Vue モバイル バレット ボックス コンポーネントの例
  • Vue チュートリアル トースト ポップアップ ボックス グローバル呼び出し例 詳細な説明
  • Vue+elementuiは、テーブル内のセルをクリックしてイベント(箇条書きボックス)をトリガーすることを実現します。
  • vue.js でのトーストの使用法とトーストポップアップボックスを使用したサンプルコード
  • 複数の箇条書きボックスのポップアップフォームの Vue のサンプルコード
  • Vue+iviewはポップアップボックスのサンプルコードを書きます
  • Vueでシンプルなポップアップダイアログを実装する方法
  • ポップアップボックスケースを実装するためのVueカスタムグローバルコンポーネント

<<:  Flash が HTML div 要素を覆わないようにする方法

>>:  CSSの一般的なプロパティ

推薦する

JavaScript の知識: コンストラクタも関数である

目次1. コンストラクタの定義と呼び出し2. 新しいキーワードの目的3. コンストラクタの問題: メ...

MySQLの7種類のログの概要

MySQL には次のログ ファイルがあります。 1: 再実行ログ2: ロールバックログ(元に戻すログ...

Ubuntu 18.04 Linux システムに JDK と Mysql をインストールする方法

プラットフォームの展開1. JDKをインストールするステップ1. OracleJDKをダウンロードす...

MySQL スロークエリログの詳細な理解

目次スロークエリログとは何ですか?スロークエリを有効にする方法ログ分析ツール mysqldumpsh...

Ubuntu 16.04 で MySQL マスター スレーブ同期を設定する方法

準備1. マスターとスレーブのデータベースのバージョンは一致している必要があります2. マスターデー...

よく使用される Linux コマンドの完全なリスト (推奨コレクション)

目次1. システム情報2. シャットダウン(システムのシャットダウン、再起動、ログアウト) 3. フ...

インタラクティブデザインでページングと読み込みのどちらを選択するかについての説明

この記事の著者@子木yoyoが個人ブログに投稿したものです。 Web ページでもモバイル アプリでも...

getdata テーブル テーブル データ 結合 mysql メソッド

パブリック関数 json_product_list($where, $order){ グローバル ...

MySQL マスタースレーブレプリケーションの詳細な分析

序文: MySQL では、マスター/スレーブ アーキテクチャが最も基本的かつ最も一般的に使用されるア...

JavaScriptの原理と方向性

これが何を指しているのかをどのように判断するのでしょうか? ①グローバル環境で呼び出された場合はwi...

MySQL 8.0 ディクショナリテーブル拡張の詳細な説明

MySQL のデータ ディクショナリは、データベースの重要なコンポーネントの 1 つです。INFOR...

js での遅延読み込みとプリロードの具体的な使用法

遅延読み込み(レイジー読み込み)とプリロードは、Web 最適化によく使用される手段です。 。 1. ...

Dockerのインストール方法とDockerの4つのネットワークモードの詳細説明

1. Dockerをインストールするyum -y install docker-ioインストールが完...

Nginxドメイン名転送のhttpsアクセスの実装

事前に一言:突然、複数のドメイン名のアクセスを https に転送するというタスクを受け取りました。...

MySQLの明示的な型変換の簡単な分析

CAST関数前回の記事では、型変換を表示するために使用する CAST 関数について説明しました。暗黙...