vue3 テレポートの詳細な使用例

vue3 テレポートの詳細な使用例

公式ウェブサイト

https://cli.vuejs.org/ja/ガイド/

場合によっては、コンポーネントのテンプレートの一部が論理的にはそのコンポーネントに属していることもありますが、技術的な観点からは、テンプレートのその部分を Vue アプリ外の DOM 内の別の場所に移動する方が適切です。

場合

ここに画像の説明を挿入

ここに画像の説明を挿入

両方のコンポーネントは親要素にあり、親コンポーネントの子ですが、技術的な観点からは、ボディの下にマウントする必要があります。

修正なしバージョン

<!DOCTYPE html>
<html>
<ヘッド>
  <メタ文字セット="utf-8">
  <title>Vue3</title>
  <script src="./vue.js"></script>
</head>
<本文>
<div id="hello-vue" クラス="box">
  <div>私は親コンポーネントです</div>
  <div>私は親コンポーネントです</div>
  <div>私は親コンポーネントです</div>
  <div>私は親コンポーネントです</div>
  <div>私は親コンポーネントです</div>
  <div>私は親コンポーネントです</div>
  <button @click="handleClick">クリックするとサブコンポーネントが表示されます</button>
  <cpn ref="compRef" @show-confirm="showConfirm"></cpn>
  <confirm ref="confirmRef" @confirm="handleConfirm" @cancel="handleCancel" text="終了してもよろしいですか?"></confirm>
</div>
<!--ボタンをクリックした後に表示されるコンポーネント-->
<テンプレートid="mycpn">
  <トランジション名="リストフェード">
    <div class="cpnContainer" v-show="isshow" @click.stop="handleClose()">
      <div class="inner-wrapper" @click.stop>
        トランジションの使用
        <div class="text">
          <div>私はインナーテキストです</div>
          <div>私はインナーテキストです</div>
          <div>私はインナーテキストです</div>
          <div>私はインナーテキストです</div>
          <div>私はインナーテキストです</div>
        </div>
        <div class="close" @click="handleClose()">閉じる</div>
      </div>
    </div>
  </トランジション>

</テンプレート>

<!--確認コンポーネントを閉じるには確認します-->
<テンプレートid="確認">
  <transition name="確認フェード">
    <div v-show="isshow" class="confirm">
      <div class="confirm-wrapper">
        <div class="コンテンツを確認">
          <p>{{テキスト}}</p>
          <div class="btnContainer">
            <button style="background-color: darkseagreen;margin-right: 40px" @click="confirm">{{confirmBtnText}}</button>
            <button @click="cancel">{{cancelBtnText}}</button>
          </div>
        </div>
      </div>
    </div>
  </トランジション>
</テンプレート>
<スクリプト>
  定数cpn = {
    テンプレート: "#mycpn",
    プロパティ: {},
    データ() {
      戻る {
        // bbb: 145612
        isshow:false
      }
    },
    メソッド: {
      見せる() {
        this.isshow = true
      },
      隠れる() {
        // console.log("非表示")
        this.isshow = false
      },
      ハンドルクローズ() {
        // console.log("非表示")
        this.$emit("表示確認")
      },

    }
  }

  定数確認 = {
    テンプレート: "#confirm",
    小道具: {
      文章: {
        タイプ: 文字列、
        デフォルト: 'fdsafdasfdas'
      },
      確認ボタンテキスト: {
        タイプ: 文字列、
        デフォルト: 'OK'
      },
      キャンセルボタンテキスト: {
        タイプ: 文字列、
        デフォルト: 'キャンセル'
      }
    },
    データ() {
      戻る {
        // bbb: 145612
        isshow: false
      }
    },
    メソッド: {
      見せる() {
        this.isshow = true
      },
      隠れる() {
        this.isshow = false
        //サブコンポーネントの表示を制御する},
      // ボタンをクリックした後、親コンポーネントにイベント confirm() をディスパッチします {
        これを非表示にします。
        this.$emit("確認")
      },
      キャンセル() {
        これを非表示にする()
        this.$emit('キャンセル')
      }
    }
  }
  定数 HelloVueApp = Vue.createApp({
    データ() {
      戻る {
        メッセージ: 'Hello Vue!!'
      }
    },
    コンポーネント:
      cpn、
      確認する
    },
    メソッド: {
      ハンドルクリック() {
        // 親コンポーネントは子コンポーネントのメソッドを呼び出します // this.$refs.compRef.show()
        this.$refs.compRef.show()
      },
      確認を表示(){
        コンソールログ("fdsa")
        this.$refs.confirmRef.show()
      },
      // キャンセルまたは確認をクリックして次のロジックを実行します handleConfirm() {
        this.$refs.compRef.hide()
      },
      ハンドルキャンセル() {

      }
    }
  }).mount("#hello-vue")

</スクリプト>
</本文>
<スタイル>
    * {
        フォントサイズ: 50px;
    }

    /*vue 組み込みトランジション*/
    .list-fade-enter-active、.list-fade-leave-active {
        遷移: 不透明度 .3 秒;
    }

    .list-fade-enter-active .inner-wrapper、.list-fade-leave-active .inner-wrapper {
        遷移: すべて .3;
    }

    .list-fade-enter-from、.list-fade-leave-to {
        不透明度: 0;
    }

    .list-fade-enter-from .inner-wrapper、.list-fade-leave-to .inner-wrapper {
        変換: translate3d(0, 100%, 0);
    }


    /*サブコンポーネントスタイル*/
    .cpnコンテナ{
        位置: 固定;
        上: 0;
        下部: 0;
        左: 0;
        右: 0;
        背景: rgba(0, 0, 0, .3);
    }

    .インナーラッパー{
        パディング: 70px;
        背景色: ダークシアン;
        位置: 固定;
        下部: 0;
        幅: 100%;
        ボックスのサイズ: 境界線ボックス;
    }

    。近い {
        位置: 絶対;
        上: 50px;
        右: 50px;
    }

    /*コンポーネントのスタイルを確認*/
    。確認する {
        位置: 固定;
        上: 0;
        下部: 0;
        左: 0;
        右: 0;
        背景色: rgba(0, 0, 0, 0.14);
    }

    .btnコンテナ{
        パディング: 0 70px;
    }
    .確認ラッパー{
        位置: 絶対;
        上位: 50%;
        左: 50%;
        変換: translate(-50%, -50%);
        zインデックス: 999;
        ボックスの影: 0px 0px 80px 3px rgba(0, 0, 0, 0.2);
    }
    .内容確認{
        オーバーフロー: 非表示;
        幅: 600ピクセル;
        境界線の半径: 13px;
        背景: 白
    }
    .confirm-content p {
        表示: ブロック;
        左パディング: 40px;
    }

    /*.内容確認{*/
    /* 境界線の半径: 8px;*/
    /* ボックスシャドウ: 0px 0px 80px 3px rgba(0, 0, 0, 0.2);*/
    /* 位置: 絶対;*/
    /* 上: 50%;*/
    /* 残り: 50%;*/
    /* 変換: translate(-50%, -50%);*/
    /* !*p タグの上部の余白は親要素 bfc に影響します*!*/
    /* !*オーバーフロー: 非表示;*!*/
    /* 背景色: 白;*/
    /*}*/

    .confirm-content ボタン {
        境界線: 1px 実線 コーンフラワーブルー;
        背景色: 透明;
        パディング: 25px 50px;
        下部マージン: 30px;
        境界線の半径: 5px;
    }
    .confirm-fade-enter-active、.confirm-fade-leave-active {
        遷移: すべて .3;
    }
    .confirm-fade-enter-from 、.confirm-fade-leave-to{
        不透明度: 0;
    }
    .confirm-fade-enter-active .confirm-content {
        アニメーション: ズームイン確認 .3s;
        変換の原点: 中心;
    }
    .confirm-fade-leave-active .confirm-content {
        アニメーション: ズームアウトの確認 .3 秒;
        変換の原点: 中心;
    }

    @keyframes ズームイン確認 {
        0% {

            変換: スケール(0);
        }
        60% {
            変換: スケール(1.1);
        }
        100% {
            変換: スケール(1);
        }
    }
    @keyframes ズームアウトの確認 {
        0% {
            変換: スケール(1);
        }
        30% {
            変換: スケール(0.4);
        }
        100% {
            変換: スケール(0);
        }
    }

</スタイル>
</html>

レイアウト

修正版

レイアウト
ここに画像の説明を挿入

<!DOCTYPE html>
<html>
<ヘッド>
  <メタ文字セット="utf-8">
  <title>Vue3</title>
  <script src="./vue.js"></script>
</head>
<本文>
<div id="hello-vue" クラス="box">
  <div>私は親コンポーネントです</div>
  <div>私は親コンポーネントです</div>
  <div>私は親コンポーネントです</div>
  <div>私は親コンポーネントです</div>
  <div>私は親コンポーネントです</div>
  <div>私は親コンポーネントです</div>
  <button @click="handleClick">クリックするとサブコンポーネントが表示されます</button>
  <cpn ref="compRef" @show-confirm="showConfirm"></cpn>
  <confirm ref="confirmRef" @confirm="handleConfirm" @cancel="handleCancel" text="終了してもよろしいですか?"></confirm>
</div>
<!--ボタンをクリックした後に表示されるコンポーネント-->
<テンプレートid="mycpn">
  <テレポート先="body">
    <トランジション名="リストフェード">
      <div class="cpnContainer" v-show="isshow" @click.stop="handleClose()">
        <div class="inner-wrapper" @click.stop>
          トランジションの使用
          <div class="text">
            <div>私はインナーテキストです</div>
            <div>私はインナーテキストです</div>
            <div>私はインナーテキストです</div>
            <div>私はインナーテキストです</div>
            <div>私はインナーテキストです</div>
          </div>
          <div class="close" @click="handleClose()">閉じる</div>
        </div>
      </div>
    </トランジション>
  </テレポート>


</テンプレート>

<!--確認コンポーネントを閉じるには確認します-->
<テンプレートid="確認">
  <テレポート先="body">
    <transition name="確認フェード">
      <div v-show="isshow" class="confirm">
        <div class="confirm-wrapper">
          <div class="コンテンツを確認">
            <p>{{テキスト}}</p>
            <div class="btnContainer">
              <button style="background-color: darkseagreen;margin-right: 40px" @click="confirm">{{confirmBtnText}}</button>
              <button @click="cancel">{{cancelBtnText}}</button>
            </div>
          </div>
        </div>
      </div>
    </トランジション>
  </テレポート>

</テンプレート>
<スクリプト>
  定数cpn = {
    テンプレート: "#mycpn",
    プロパティ: {},
    データ() {
      戻る {
        // bbb: 145612
        isshow: false
      }
    },
    メソッド: {
      見せる() {
        this.isshow = true
      },
      隠れる() {
        // console.log("非表示")
        this.isshow = false
      },
      ハンドルクローズ() {
        // console.log("非表示")
        this.$emit("表示確認")
      },

    }
  }

  定数確認 = {
    テンプレート: "#confirm",
    小道具: {
      文章: {
        タイプ: 文字列、
        デフォルト: 'fdsafdasfdas'
      },
      確認ボタンテキスト: {
        タイプ: 文字列、
        デフォルト: 'OK'
      },
      キャンセルボタンテキスト: {
        タイプ: 文字列、
        デフォルト: 'キャンセル'
      }
    },
    データ() {
      戻る {
        // bbb: 145612
        isshow: false
      }
    },
    メソッド: {
      見せる() {
        this.isshow = true
      },
      隠れる() {
        this.isshow = false
        //サブコンポーネントの表示を制御する},
      // ボタンをクリックした後、親コンポーネントにイベント confirm() をディスパッチします {
        これを非表示にします。
        this.$emit("確認")
      },
      キャンセル() {
        これを非表示にする()
        this.$emit('キャンセル')
      }
    }
  }
  定数 HelloVueApp = Vue.createApp({
    データ() {
      戻る {
        メッセージ: 'Hello Vue!!'
      }
    },
    コンポーネント:
      cpn、
      確認する
    },
    メソッド: {
      ハンドルクリック() {
        // 親コンポーネントは子コンポーネントのメソッドを呼び出します // this.$refs.compRef.show()
        this.$refs.compRef.show()
      },
      確認を表示(){
        コンソールログ("fdsa")
        this.$refs.confirmRef.show()
      },
      // キャンセルまたは確認をクリックして次のロジックを実行します handleConfirm() {
        this.$refs.compRef.hide()
      },
      ハンドルキャンセル() {

      }
    }
  }).mount("#hello-vue")

</スクリプト>
</本文>
<スタイル>
    * {
        フォントサイズ: 50px;
    }

    /*vue 組み込みトランジション*/
    .list-fade-enter-active、.list-fade-leave-active {
        遷移: 不透明度 .3 秒;
    }

    .list-fade-enter-active .inner-wrapper、.list-fade-leave-active .inner-wrapper {
        遷移: すべて .3;
    }

    .list-fade-enter-from、.list-fade-leave-to {
        不透明度: 0;
    }

    .list-fade-enter-from .inner-wrapper、.list-fade-leave-to .inner-wrapper {
        変換: translate3d(0, 100%, 0);
    }


    /*サブコンポーネントスタイル*/
    .cpnコンテナ{
        位置: 固定;
        上: 0;
        下部: 0;
        左: 0;
        右: 0;
        背景: rgba(0, 0, 0, .3);
    }

    .インナーラッパー{
        パディング: 70px;
        背景色: ダークシアン;
        位置: 固定;
        下部: 0;
        幅: 100%;
        ボックスのサイズ: 境界線ボックス;
    }

    。近い {
        位置: 絶対;
        上: 50px;
        右: 50px;
    }

    /*コンポーネントのスタイルを確認*/
    。確認する {
        位置: 固定;
        上: 0;
        下部: 0;
        左: 0;
        右: 0;
        背景色: rgba(0, 0, 0, 0.14);
    }

    .btnコンテナ{
        パディング: 0 70px;
    }
    .confirm-wrapper{
        位置: 絶対;
        上位: 50%;
        左: 50%;
        変換: translate(-50%, -50%);
        zインデックス: 999;
        ボックスの影: 0px 0px 80px 3px rgba(0, 0, 0, 0.2);
    }
    .内容確認{
        オーバーフロー: 非表示;
        幅: 600ピクセル;
        境界線の半径: 13px;
        背景: 白
    }
    .confirm-content p {
        表示: ブロック;
        左パディング: 40px;
    }

    /*.内容確認 {*/
    /* 境界線の半径: 8px;*/
    /* ボックスシャドウ: 0px 0px 80px 3px rgba(0, 0, 0, 0.2);*/
    /* 位置: 絶対;*/
    /* 上: 50%;*/
    /* 残り: 50%;*/
    /* 変換: translate(-50%, -50%);*/
    /* !*p タグの上部の余白は親要素 bfc に影響します*!*/
    /* !*オーバーフロー: 非表示;*!*/
    /* 背景色: 白;*/
    /*}*/

    .confirm-content ボタン {
        境界線: 1px 実線 コーンフラワーブルー;
        背景色: 透明;
        パディング: 25px 50px;
        下部マージン: 30px;
        境界線の半径: 5px;
    }
    .confirm-fade-enter-active、.confirm-fade-leave-active {
        遷移: すべて .3;
    }
    .confirm-fade-enter-from 、.confirm-fade-leave-to{
        不透明度: 0;
    }
    .confirm-fade-enter-active .confirm-content {
        アニメーション: ズームイン確認 .3s;
        変換の原点: 中心;
    }
    .confirm-fade-leave-active .confirm-content {
        アニメーション: ズームアウトの確認 .3 秒;
        変換の原点: 中心;
    }

    @keyframes ズームイン確認 {
        0% {

            変換: スケール(0);
        }
        60% {
            変換: スケール(1.1);
        }
        100% {
            変換: スケール(1);
        }
    }
    @keyframes ズームアウトの確認 {
        0% {
            変換: スケール(1);
        }
        30% {
            変換: スケール(0.4);
        }
        100% {
            変換: スケール(0);
        }
    }

</スタイル>
</html>

この事件で使用された知識

親コンポーネントはどのようにして子コンポーネントのメソッドを呼び出すのでしょうか? ref を使用してコンポーネントを取得し、コンポーネント内のメソッドを呼び出します。
バブリングする子コンポーネントが親コンポーネントにイベントを送信するのを防ぐイベントについて(emit)
ボックスシャドウ
Vue トランジションアニメーションに関する質問: 確認ズームアニメーションをコンテナーに配置できず、コンテンツにのみ配置できるのはなぜですか?

これで、vue3 テレポートの使用デモに関するこの記事は終了です。vue3 テレポートの使用に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue3の組み込みコンポーネントであるTeleportの使い方を詳しく説明します
  • Vue3 での Teleport の使用に関する詳細な説明
  • vue3のテレポート瞬間移動機能の使い方を詳しく解説

<<:  基本的な HTML ディレクトリの問題 (相対パスと絶対パスの違い)

>>:  Navicatをサーバー上のdockerデータベースに接続する方法

推薦する

Centos7のホスト名を変更する3つの方法

方法 1: hostnamectl の変更ステップ1 ホスト名を確認するホスト名ステップ2 ホスト名...

WeChatアプレットはふるいを振る効果を実現

この記事では、WeChatアプレットの具体的なコードを参考までに共有します。具体的な内容は次のとおり...

myisamchk および mysqlcheck ツールを使用して破損した MySQL データベース ファイルを迅速に修復する方法

サーバーのデータベース ハード ディスク領域がいっぱいだったため、大量のデータの書き込みに失敗し、「...

Centos 7 64 ビット デスクトップ バージョンのインストール グラフィック チュートリアル

システムが遅いと感じてソースを変更したい場合は、別の記事で整理しました https://blog.c...

Mysql 8.0 のインストールとパスワードのリセットの問題

Mysql 8.0 のインストールの問題とパスワードのリセット1: MySqlをダウンロードする公式...

after疑似要素を使用して中空の三角矢印とXアイコンを実装する例

フロントエンドのデザイン案では、「X」や「>」の形をした閉じるボタンや、他の 3 方向の白抜き...

Docker nginx + https サブドメイン設定の詳細なチュートリアル

今日はたまたま友人のサーバーの移転を手伝うことになり、サーバーの基本的な設備の設定を行ったのですが、...

フロントエンドアプリケーションのjenkins+gitlab+nginxデプロイメント

目次関連する依存関係のインストールドッカーDockerでJenkinsをインストールするDocker...

Linux で静的ルーティングを追加するための 2 つの実装方法の分析

ルートを追加するコマンド: 1.ルート追加route add -net 192.56.76.0 ne...

WindowsとLinux間でファイルを転送する方法

WindowsとLinux間のファイル転送(1)WinSCPを使用して、WindowsファイルをLi...

MySQL sql_modeクエリと設定の詳細な説明

1. SQLを実行して表示する @@session.sql_mode を選択します。 グローバルレベ...

複雑なSQLクエリを含むMySQLの一般的なSQL文の概要

1. 複雑なSQLクエリ1.1. 単一テーブルクエリ(1)指定の列を選択する[例] 全生徒の生徒ID...

MySQL InnoDB ストレージエンジンのメモリ管理の詳細な説明

目次ストレージエンジンのメモリ管理データ ページを LRU キューの先頭に置かないのはなぜですか?ダ...

Vue は Websocket カスタマー サービス チャット機能を実装します

この記事では主に基本的なチャットの実装方法を紹介します。今後は絵文字や写真のアップロードなどの機能も...

MySQL のロックに関する問題

ロックの分類:データ操作の粒度から:テーブルロック:操作時にテーブル全体がロックされます。行ロック:...