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 コンポーネントの開発モードでもあります。 ドロップダウン.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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: 例を通してMySQLの更新がテーブルをロックするかどうかを判定する
>>: Idea は、Web プロジェクトを開始するように Tomcat を設定します。グラフィック チュートリアル
easyui フレームワークのコードは次のとおりです。 css: .ファイルボックス{ フロート:...
MySQLをインストールする6つの手順(インストールパッケージのみがインストール場所を選択できます)...
この記事では、参考までに簡単なタイマーを実装するためのJavaScriptの具体的なコードを紹介しま...
導入以前、ある問題に気づきました。学習ビデオを視聴しているとき、動きが遅すぎる、先生が黒板に書くのに...
コードをコピーコードは次のとおりです。 <フォームメソッド="post" ...
NATこのようにして、仮想マシンのネットワーク カードはホストの VMnet8 に接続されます。この...
ユーザーを作成します: 'oukele' によって識別されるユーザー 'ou...
ここ数年、ウェブサイト開発では DIV+CSS が非常に人気があり、当時は大きな騒動を引き起こしまし...
目次1. 計画タスクをカスタマイズする2. 時間を同期する3. 練習する4. セキュリティの問題1....
序文職場で次のような状況に遭遇しました。ログ システムのテーブルでは、時間フィールドには日付データで...
目次MVCとMVVMの違い前述のMVCC の概要長所と短所MVVM概要MVVM 実装者 — Vue ...
この記事では、参考までに、シンプルなページカウントダウンを実装するためのJavaScriptの具体的...
この記事では、HTML描画ユーザー登録ページの具体的な実装コードを参考までに共有します。具体的な内容...
MySQL 5.7コマンドを使用するMySQLコマンドラインクライアント1. パスワードを入力してく...
テンプレート <el-table :data="データリスト"> &...