1. テレポートについて知るたとえば、Teleport を使用せずに、Modal コンポーネント、Message コンポーネント、Loading コンポーネントなどのグローバル コンポーネントを記述し、それらを .vue ファイルに導入すると、それらの HTML 構造がコンポーネント テンプレートに追加され、完璧ではありません。
以下は、Teleportを使用してモーダルコンポーネントを開発する方法の実践的な紹介です。 2. テレポートの基本的な使い方Teleport の書き方は非常に簡単です。コンテンツを <Teleport></Teleport> で囲み、どの親ノードの下に HTML を配置するかを指定するだけです。 <テレポート先="#modal"> コンテンツ</teleport> 3. 最初のステップの最適化Teleport がマウントする DOM をコード内にハードコードすると、グローバル コンポーネントが作成されるたびに DOM ノードが必要になり、その数はどんどん増えて、常に存在することになります。この記述方法はあまりエレガントではありません。より良い解決策は次のとおりです。
設定(){ 定数ノード = 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">×</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 の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: mysql8.0.12 でルートパスワードをリセットする方法
>>: Ubuntu 18.04 での Pycharm インストール チュートリアルの実装
みなさんこんにちは、Qiufengです。最近、WeChatは新しい機能をリリースしました(WeCha...
目次1. 範囲2. スコープチェーン3. 語彙の範囲5. 閉鎖の適用6. クロージャの欠陥7. 閉会...
目次1. letキーワード1.1 基本的な使い方1.2 変動昇進はない1.3 一時的なデッドゾーン1...
目次概要コンポーネントクラスの型定義を作成するジェネリック型を使用してPropsとStateを定義す...
20200804追記:記事の内容に誤りがある可能性があります。他の回答を検索することもできます。 d...
1. Vimの公式ウェブサイトにアクセスして、オペレーティングシステムに適した実行ファイルをダウンロ...
JavaScript は現在、毎年新しいバージョンがリリースされており、より便利で効率的な新しい演算...
1. モバイル端末がリストスライドを処理するとき、WeChat には下部にページに戻るボタンが組み...
序文: MYSQL は最も人気のある WEB バックエンド データベースです。最近、NOSQL がま...
企業の Web サイト、個人のブログ、ショッピング Web サイト、ゲーム Web サイトなど、どの...
MySQLはOracleのようなシーケンスを実装しているOracle は通常、主キー フィールドを処...
1. 文書化ルール1. 大文字と小文字が区別されます。 2. 属性値は引用符(一重引用符または二重引...
LinuxサーバーのデフォルトのSSHポート番号は通常22なので、ほとんどのユーザーはセキュリティ上...
目次概要1. コンポジションAPI 1. ref と reactive の違いは何ですか? 2. 周...
数日前に CentOS8 がリリースされました。8 の最初のバージョンですが、今日は VM12 に ...