【Vue.jsライブラリ】vue-click-outsideを実装したい!
下記、参考にさせていただきvue-click-outsideを実装し、ドロップダウンメニューを開き、
メニュー以外(リンク以外の場所)をクリックしたら非表示にするようにしたいです。
※現状は、クリックで表示・非表示のみです。。
【簡単】vue-click-outsideライブラリを使ってみた
枠外をクリックして閉じれるドロップダウンの実装
参考しにて実際に記述してみましたが、上手く実装されません・・
もし分かる方いらっしゃいましたらお力添えをいただきたいです。
勉強し始めたばかりなので至らぬ点が多いかとお思いますが、どこをどう直したら良いかご教授いただけると幸いです。
宜しくお願い致します。
html
1<template> 2 <header class="header"> 3 <router-link to="/" class="header-ttl"> 4 <span class="header-ttl-color">C</span>inema</router-link 5 > 6 <ul class="header-menu"> 7 <li> 8 <router-link to="/first" class="header-link">初めての方へ</router-link> 9 </li> 10 <li> 11 <router-link to="/signup" class="header-link" v-if="authenticatedUser" 12 >新規登録</router-link 13 > 14 </li> 15 <li> 16 <router-link to="/signin" class="header-link" v-if="authenticatedUser" 17 >ログイン</router-link 18 > 19 </li> 20 <li> 21 <span class="dropdown-menu" v-click-outside="close" @click="open"> 22 <a class="header-link" 23 >マイページ<span class="dropdown-arrow"></span 24 ></a> 25 <ul class="dropdown" :class="{ isOpen }"> 26 <li class="dropdown-items"> 27 <router-link to="/mypage" class="dropdown-link" 28 >マイページ</router-link 29 > 30 </li> 31 <li class="dropdown-items"> 32 <router-link to="/profile" class="dropdown-link" 33 >プロフィール編集</router-link 34 > 35 </li> 36 <li class="dropdown-items" v-if="authenticatedUserSignout"> 37 <button 38 class="dropdown-link" 39 @click="signOut" 40 v-if="authenticatedUserSignout" 41 > 42 ログアウト 43 </button> 44 </li> 45 </ul> 46 </span> 47 </li> 48 </ul> 49 </header> 50</template> 51 52
js
1<script> 2import firebase from "firebase"; 3import ClickOutside from "vue-click-outside"; 4 5export default { 6 name: "signOut", 7 data() { 8 return { 9 authenticatedUser: "", 10 authenticatedUserSignout: "", 11 isOpen: false, 12 }; 13 }, 14 methods: { 15 //ログアウトを実装 16 signOut: function() { 17 firebase 18 .auth() 19 .signOut() 20 .then(() => { 21 // alert("ログアウトしました。"); 22 this.$router.push("/signin"); 23 }) 24 .catch(() => { 25 // alert("ログアウトができません。"); 26 }); 27 }, 28 open: function() { 29 this.isOpen = !this.isOpen; 30 }, 31 }, 32 mounted() { 33 //以下、ユーザーが認証済みであれば「ログイン」と「新規登録」を非表示 34 firebase.auth().onAuthStateChanged((user) => { 35 if (user) { 36 this.authenticatedUser = false; 37 } else { 38 this.authenticatedUser = true; 39 } 40 }); 41 //以下、ユーザーが認証済みであれば「ログアウト」を表示 42 firebase.auth().onAuthStateChanged((user) => { 43 if (user) { 44 this.authenticatedUserSignout = true; 45 } else { 46 this.authenticatedUserSignout = false; 47 } 48 }); 49 this.popupItem = this.$el; 50 }, 51 //directivesオプションを使用することにより、ローカルディレクティブに登録されるため、機能を使える 52 directives: { 53 ClickOutside, 54 }, 55}; 56</script>
css
1<style lang="scss"> 2@import url("https://fonts.googleapis.com/css2?family=Roboto:ital,wght@1,500&display=swap"); 3 4.header { 5 position: sticky; 6 top: 0; 7 background-color: #000000; 8 padding: 1rem 3rem; 9 z-index: 999; 10 display: flex; 11 align-items: center; 12 &-ttl { 13 color: #fff; 14 font-size: 2rem; 15 font-weight: bold; 16 text-decoration: none; 17 background-color: transparent; 18 border: none; 19 outline: none; 20 font-family: "Roboto", sans-serif; 21 &-color { 22 color: grey; 23 font-size: 2.5rem; 24 } 25 } 26 &-menu { 27 display: flex; 28 margin-left: auto; 29 .dropdown-menu { 30 position: relative; 31 display: flex; 32 .dropdown-link { 33 color: #fff; 34 font-family: "Franklin Gothic Medium", "Arial Narrow", Arial, sans-serif; 35 text-decoration: none; 36 background-color: transparent; 37 border: none; 38 outline: none; 39 font-size: 1rem; 40 font-weight: bold; 41 cursor: pointer; 42 cursor: hand; 43 &:hover { 44 color: grey; 45 } 46 } 47 } 48 } 49 &-link { 50 color: #fff; 51 font-family: "Franklin Gothic Medium", "Arial Narrow", Arial, sans-serif; 52 text-decoration: none; 53 background-color: transparent; 54 border: none; 55 outline: none; 56 font-size: 1rem; 57 font-weight: bold; 58 cursor: pointer; 59 cursor: hand; 60 margin-left: 3rem; 61 &:not(:first-child) { 62 margin-left: 2rem; 63 } 64 &:hover { 65 color: #bbb; 66 } 67 } 68} 69 70.dropdown-arrow { 71 width: 0px; 72 height: 0px; 73 position: absolute; 74 top: 9px; 75 right: -20px; 76 border-left: 6px solid transparent; 77 border-right: 6px solid transparent; 78 border-top: 7px solid white; 79 .header-link:hover & { 80 border-top-color: #bbb; 81 } 82} 83 84.dropdown { 85 width: 10rem; 86 height: auto; 87 position: absolute; 88 top: 50px; 89 right: -47px; 90 display: none; 91 background-color: #000000; 92 &-items { 93 padding: 1rem; 94 border-bottom: 1px solid #fff; 95 } 96} 97 98.isOpen { 99 display: block; 100} 101 102a.header-ttl:hover, 103a.header-ttl:hover span { 104 color: #bbb; 105} 106</style>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。