VueはTeleportをベースにModalコンポーネントを実装します

VueはTeleportをベースにModalコンポーネントを実装します

1. テレポートについて知る

たとえば、Teleport を使用せずに、Modal コンポーネント、Message コンポーネント、Loading コンポーネントなどのグローバル コンポーネントを記述し、それらを .vue ファイルに導入すると、それらの HTML 構造がコンポーネント テンプレートに追加され、完璧ではありません。

  • テレポートなし

  • テレポート

以下は、Teleportを使用してモーダルコンポーネントを開発する方法の実践的な紹介です。

2. テレポートの基本的な使い方

Teleport の書き方は非常に簡単です。コンテンツを <Teleport></Teleport> で囲み、どの親ノードの下に HTML を配置するかを指定するだけです。

<テレポート先="#modal">
コンテンツ</teleport>

3. 最初のステップの最適化

Teleport がマウントする DOM をコード内にハードコードすると、グローバル コンポーネントが作成されるたびに DOM ノードが必要になり、その数はどんどん増えて、常に存在することになります。この記述方法はあまりエレガントではありません。より良い解決策は次のとおりです。

  • コンポーネントを作成するときに、DOM ノード document.createElement() を動的に作成します。
  • そしてそれを本文に追加します。document.body.appendChild()、
  • コンポーネントがアンインストールされたら、この dom document.body.removeChild() を破棄します。
設定(){
  定数ノード = document.createElement('div')
  node.id = 'モーダル'
  document.body.appendChild(ノード)
  マウント解除時(() => {
    document.body.removeChild(ノード)
  })
}

4. 第2段階の最適化

将来、Message コンポーネント、Loading コンポーネント、その他の機能を追加する場合は、Teleport も使用する必要があります。各コンポーネントにこのようなコードを記述するのは少し冗長です。Vue3 を使用すると、論理関数を簡単に抽出できるため、ロジックの再利用の目的を達成できます。

このロジックをカプセル化するために、src-hooksフォルダにuseDOMCreate.tsファイルを作成します。

// フック/useDOMCreate.ts
'vue' から { onUnmounted } をインポートします

関数 useDOMCreate(nodeId:string):void {
  定数ノード = document.createElement('div')
  ノードID = ノードID
  document.body.appendChild(ノード)
  マウント解除時(() => {
    document.body.removeChild(ノード)
  })
}
エクスポートデフォルトuseDOMCreate

使用:

'../hooks/useDOMCreate' から useDOMCreate をインポートします。
セットアップ(props, ctx) {
    useDOMCreate('モーダル')
}

5. モーダルコンポーネントを実装する

Modal コンポーネントをカプセル化する詳細についてはここでは説明しません。また、複雑なロジックはありません。コードに直接。

//モーダル.vue
<テンプレート>
  <テレポート先="#modal">
    <div class="modal d-block" tabindex="-1" v-if="isVisible">
      <div class="modal-dialog">
        <div class="modal-content">
          <div class="modal-header">
            <h5 class="modal-title">{{title}}</h5>
            <button type="button" class="close" data-dismiss="modal" aria-label="閉じる">
              <span aria-hidden="true" @click="onClose">&times;</span>
            </ボタン>
          </div>
          <div class="modal-body">
            <スロット></スロット>
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-secondary" data-dismiss="modal" @click="onClose">キャンセル</button>
            <button type="button" class="btn btn-primary" @click="onConfirm">確認</button>
          </div>
        </div>
      </div>
    </div>
  </テレポート>
</テンプレート>
<script lang="ts">
'vue' から {defineComponent} をインポートします。
'../hooks/useDOMCreate' から useDOMCreate をインポートします。
エクスポートデフォルトdefineComponent({
  名前: 'モーダル'、
  出力: ['model-close', 'model-confirm'],
  小道具: {
    タイトル:
      タイプ: 文字列、
      デフォルト: ''
    },
    表示可能: {
      タイプ: ブール値、
      デフォルト: false
    }
  },
  セットアップ(props, ctx) {
    useDOMCreate('モーダル')
    定数 onClose = () => {
      ctx.emit('モデルを閉じる')
    }
    定数onConfirm = () => {
      ctx.emit('モデル確認')
    }
    戻る {
      閉じる時、
      確認時
    }
  }
})
</スクリプト>

使用例

<テンプレート>
  <div class="post-detail-page">
    <button type="button" class="btn btn-danger" @click="handleDelete">削除</button>
    <modal title='削除してもよろしいですか? ' :isVisible="modalVisible" @model-close="handleModalClose" @model-confirm="handleModalConfim">
      <p>この記事を削除してもよろしいですか? </p>
    </モーダル>
  </div>
</テンプレート>
<script lang="ts">
'vue' から {defineComponent, ref} をインポートします。
'../components/Modal.vue' から Modal をインポートします。

エクスポートデフォルトdefineComponent({
  名前: 'post-detail'、
  コンポーネント: { モーダル },
  設定() {
    定数 modalVisible = ref(false)
    const ハンドル削除 = () => {
      modalVisible.value = true
    }
    const hanldeModalClose = () => {
      modalVisible.value = false
    }
    const ハンドルモーダル確認 = () => {
      modalVisible.value = false
      ...
     //後続の論理処理}
    戻る {
      hanldeModalClose、
      ハンドルモーダル確認、
      ハンドル削除、
      モーダル表示可能
    }
  }
})
</スクリプト>

上記は、vue が Teleport に基づいて Modal コンポーネントを実装する方法の詳細です。vue Teleport が Modal コンポーネントを実装する方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Vue3 での Teleport の使用に関する詳細な説明
  • vue3のテレポート瞬間移動機能の使い方を詳しく解説
  • Vue3 Teleportの実践と原理の詳細な説明
  • Vue3 でダイアログとモーダル コンポーネントをカスタマイズする方法
  • 手書きの Vue ポップアップ ウィンドウ モーダル実装コード
  • vueコンポーネントのiviewのモーダルコンポーネントには問題があります。モーダルが表示されるかどうかに関係なく、v-showを使用する必要があります。

<<:  mysql8.0.12 でルートパスワードをリセットする方法

>>:  Ubuntu 18.04 での Pycharm インストール チュートリアルの実装

推薦する

js と jQuery での Ajax の使用例の詳細

目次ネイティブJS GETリクエストの送信方法投稿リクエストの送信方法パラメータ付きのGETリクエス...

MySQLはテーブル内のフィールドを別のテーブル内のフィールドの値と等しくなるように更新します

以下のように表示されます。 table1 を z として更新し、table2 を zb として結合し...

MySQL で大量のデータ (数千万) を素早く削除するためのいくつかの実用的なソリューションの詳細な説明

著者は最近、仕事でパフォーマンスのボトルネックの問題に遭遇しました。MySQL テーブルには毎日約 ...

MySQL の group by に関する簡単な説明

目次1. はじめに2. ユーザーテーブルを準備する2.1 グループ化ルール2.2 グループの使用2....

JavaScript の基本演算子

目次1. オペレーター要約する1. オペレーター演算子は、代入、比較、算術演算などの機能を実装するた...

MySQL FAQ シリーズ: ibdata1 ファイルのサイズが突然増加しないようにする方法

0. はじめにibdata1 ファイルとは何ですか? ibdata1 は、innodb システム テ...

画像ボタン送信とフォーム繰り返し送信の問題に関する議論

多くの場合、フォームを美しくするために、送信ボタンが画像に置き換えられます。ただし、細部に注意を払わ...

よく使われるLinuxコマンド「ll」が無効、またはコマンドが見つからないという問題を解決します

質問:よく使用されるコマンド「ll」が無効であるか、コマンドが見つかりません理由: 「ll」コマンド...

MySQL 継続的集計の原理と使用法の分析

この記事では、例を使用して、MySQL の継続的な集計の原理と使用方法を説明します。ご参考までに、詳...

Linuxでスクリーンショットを撮って編集するための最高のツール

メインのオペレーティング システムを Windows から Ubuntu に切り替えたとき、最初に考...

Tencent Cloud で HTTPS を無料で導入する方法

最近、WeChatアプレットを書いていたとき、WeChatアプレットではすべてのリクエストインターフ...

Linux での Tomcat8 のインストールとアンインストールに関する詳細なグラフィック チュートリアル

[ Tomcat8 の Linux インストール ] Tomcat をアンインストールする - まず...

js 正規表現の先読みと後読み、および非キャプチャグループ化

目次先読みと後読みをキャプチャグループと組み合わせる捕獲グループと非捕獲グループ前を向いて、後ろを振...

解析を実装するためにPostgreSQLデータベースを書き込むSQLスクリプト関数

この記事は主に、PostgreSQL データベースを記述して解析を実装する SQL スクリプト関数を...

OpenLayersはポイントフィーチャーレイヤーの集約表示方法を実現します

目次1. はじめに2. ポイントフィーチャーレイヤーの集約3. 重合の特殊処理4. 重合の特殊処理 ...