Vue3.0はドロップダウンメニューのカプセル化を実装します

Vue3.0はドロップダウンメニューのカプセル化を実装します

Vue3.0 がリリースされてからしばらく経ちましたが、勉強を始める必要があります。

まず、達成したい効果を見てみましょう

メニュー項目のコンテンツを展開することは非常に一般的です。vue3.0でそれを開発するにはどうすればよいでしょうか?ここでは、bootstrapのデフォルトスタイルを使用します。

アイデア1:

<DropDown :title="'終了'" :list="メニューリスト" />

アイデア2:

<ドロップダウン:title="'終了'">
   <drop-dowm-item>新しい記事を作成する</drop-down-item>
   <drop-dowm-item>記事の編集</drop-down-item>
   <drop-dowm-item>個人情報</drop-down-item>
</ドロップダウン>

どちらのアイデアも問題ありません。比較すると、2 番目のアイデアの方が明確です。これを使用すると、具体的なレベルがわかり、それが elementUI コンポーネントの開発モードでもあります。
では、2番目のコンポーネント開発のアイデアを分析してみましょう

ドロップダウン.ts

<テンプレート>
  <div class="dropdown" ref="dropDownRef">
    <a
      @click.prevent="開く"
      class="btn btn-secondary ドロップダウントグル"
      href="#" rel="外部nofollow" 
    >
      {{ タイトル }}
    </a>
    <div class="dropdown-menu" :style="{ display: 'block' }" v-show="isOpen">
      <スロット></スロット>
    </div>
  </div>
</テンプレート>

js部分

<script lang="ts">
「vue」から、defineComponent、ref、onMounted、onUnmounted、watch } をインポートします。
「../hooks/useClickOutside」からuseClickOutsideをインポートします。
エクスポートデフォルトdefineComponent({
  名前:「ドロップダウン」、
  小道具: {
    タイトル:
      タイプ: 文字列、
      必須: true、
    },
  },

  セットアップ(コンテキスト) {
    定数isOpen = ref(false);
    //vue3.0 は DOM オブジェクトの参照を取得します。const dropDownRef = ref<null | HTMLElement>(null);
    const トグルオープン = () => {
      isOpen.value = !isOpen.value;
    };
    const handleClick = (e: マウスイベント) => {
      console.log(e.target, "e");
      if (dropDownRef.value) {
        console.log(dropDownRef.値);
        もし (
        //contains はノードにノードが含まれているかどうかを判定します!dropDownRef.value.contains(e.target as HTMLElement) &&
          isOpen.値
        ){
          isOpen.値 = false;
        }
      }
    };
    マウント時(() => {
    //グローバル クリック イベントを登録します document.addEventListener("click", handleClick);
    });
    マウント解除時(() => {
    //バインド解除 document.removeEventListener("click", handleClick);
    }); 
    戻る {
      開いている、
      トグル開く、
      ドロップダウン参照、
    };
  },
});
</スクリプト>

ドロップダウンアイテム.ts

<テンプレート>
  <li class="dropdowm-option" :class="{ 'is-disabled': 無効 }">
    <スロット></スロット>
  </li>
</テンプレート>
<スタイルスコープ>

/* ここがスロットを貫通させる必要がある場所です*/
.dropdowm-option.is-disabled >>> * {
  色: #6c757d;
  ポインタイベント: なし;
  背景色: 透明;
}
</スタイル>
<script lang="ts">
「vue」からdefineComponentをインポートします。

エクスポートデフォルトdefineComponent({
  小道具: {
    無効:
      タイプ: ブール値、
      デフォルト: false、
    },
  },
  設定() {
    戻る {};
  },
});
</スクリプト>

この時点でコンポーネントは完成します。しかし...ドキュメント全体を非表示にするためにクリックするイベントはコンポーネント全体とはあまり関係がないので、フックに抽出することができます。

クリックアウトサイド.ts

'vue' から { ref, onMounted, onUnmounted,Ref } をインポートします。
const useClickOutside = (elementRef:Ref<null | HTMLElement>) => {
    定数isClickOutside = ref(false)
    const ハンドラ = (e: MouseEvent) => {
        console.log(要素参照値);
        if (要素参照値) {
            if (elementRef.value.contains(e.target as HTMLElement)) {
                isClickOutside.value = false
            } それ以外 {
                isClickOutside.value = true
            }
        }
    }
    マウント時(() => {
      document.addEventListener("クリック", ハンドラー);
    });
    マウント解除時(() => {
      document.removeEventListener("click", ハンドラー);
    });
    isClickOutsideを返す
}

エクスポートデフォルトuseClickOutside

次にDropDown.tsコンポーネントを書き直します

//既存のイベントロジックを削除します<script lang="ts">
... 
 定数isClickOutside = useClickOutside(dropDownRef);
    /* console.log(isClickOutside.value, "isClickOutside"); */
    //監視方法を導入し、データが変更されると、isOpen の値を false に変更します
    ウォッチ(isClickOutside, (newValue) => {
      if (isOpen.value && isClickOutside.value) {
        isOpen.値 = false;
      }
    });
 ...
</スクリプト>

同じ効果が得られ、コンポーネント全体のコードも大幅に簡素化されます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • vue3 キャッシュページキープアライブと統合ルーティング処理の詳細な説明
  • Vue3.0とBootstrapを組み合わせてマルチページアプリケーションを作成する
  • Vue3+TypeScriptは再帰メニューコンポーネントの完全な例を実装します
  • Vue2.x と Vue3.x のルーティングフックの違いの詳細な説明
  • Vue3ルーティングVueRouter4を使用する簡単な例
  • Vue2/vue3 ルーティング権限管理方法の例
  • Vue3 ページ、メニュー、ルートの使用

<<:  例を通してMySQLの更新がテーブルをロックするかどうかを判定する

>>:  Idea は、Web プロジェクトを開始するように Tomcat を設定します。グラフィック チュートリアル

推薦する

mysql8.0.20 のダウンロードとインストールおよび発生した問題 (図とテキスト)

1.ブラウザでmysqlを検索してダウンロードしてインストールしますアドレス: https://d...

Docker Compose を使用して Confluence を構築するチュートリアル

この記事は「Attribution 4.0 International (CC BY 4.0)」ライ...

Docker nginxは1つのホストを実装して複数のサイトを展開します

とあるサイトからレンタルした仮想マシンの有効期限が近づいており、更新料が200元以上かかります。Al...

Nginx http ヘルスチェック構成プロセス分析

パッシブチェックパッシブ ヘルス チェックでは、NGINX と NGINX Plus はイベントの発...

CSS で TikTok テキスト揺れエフェクトを実装する例

日々の開発において、フロントエンドの学生はアニメーションやデザインについてよく議論します。デザイナー...

一般的でない js 演算演算子の概要

目次2. カンマ演算子3. JavaScript Null 結合演算子 (??) 4. JavaSc...

sqlite を mysql スクリプトに移行する方法

さっそく、コードを直接投稿します。具体的なコードは次のとおりです。 パーレル # # https:/...

CSS で美しい時計アニメーション効果を実装するためのサンプルコード

仕事を探しています!!!事前準備:まず、このアニメーションは、以前のローディングアニメーションとクー...

wavesurfer.js によるオーディオ波形描画の実装

1. レンダリングを見る進むを選択: 後方を選択: コードは次のとおりです(例): <テンプレ...

MySQLの論理アーキテクチャに関する深い理解

MySQL は現在、ほとんどの企業や事業体で使用されているデータベースです。MySQL が使用される...

TypeScript のユニオン型、交差型、型ガード

目次1. ユニオンタイプ2. クロスオーバータイプ3. 型保護3.1 カスタム型保護3.2 保護の種...

要素シャトルフレームのパフォーマンス最適化の実装

目次背景解決新しい質問高度な背景シャトル ボックスが大量のデータを処理すると、レンダリングされる D...

Linux (Ubuntu) での MySQL 5.6.28 のインストールと設定のチュートリアル

mysql5.6.28のインストールと設定方法1. 基本的なシステム情報を確認し、yumでインストー...

Docker データボリュームの一般的な操作コードの例

開発者が Dockerfile を使用してイメージをビルドする場合は、イメージをビルドするときにデー...

MySQLフィルタリングレプリケーションのアイデアの詳細な説明

目次mysql フィルター レプリケーションメインデータベースに実装ライブラリから実装いくつかの質問...