teratail header banner
teratail header banner
質問するログイン新規登録
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

Q&A

解決済

1回答

3287閲覧

【vue.js】router-link内のv-on(@click)にてクリックイベントが発生しない

wepowepon

総合スコア1

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

0グッド

0クリップ

投稿2021/09/28 07:22

編集2021/09/28 07:31

0

0

前提・実現したいこと

現在ログイン機能の実装をしております。
ログイン状態に応じてヘッダーの中身を変えたいです。

ログイン前→ Loginボタン&Registerボタン(新規登録画面へ遷移する)
ログイン中→ Logoutボタンのみ

しかし、今の実装ですとログアウトをしてもLogoutボタンが表示されており、ログアウトが正しく行われていないようです。
おそらくrouter-link内のv-on(@click)にてクリックイベントが発火していないことが原因だと思いますが、解決が難しかったため、ご教示頂けますと幸いです。

発生している問題・エラーメッセージ

エラーは発生していません。

該当のソースコード

vue.js

1//vue.js 2 3<template> 4 <nav class="navbar navbar-expand-md navbar-dark bg-dark"> 5 <ul class="navbar-nav mr-auto"> 6 <li class="nav-item"> 7 <router-link to="/" class="nav-link">Home</router-link> 8 </li> 9 </ul> 10 11 <ul class="navbar-nav my-2 my-lg-0"> 12 <!-- ログイン済みなら表示 --> 13 <template v-if = "auth"> 14 <li class="nav-item"> 15 <router-link to="/login" class="nav-link" @click="logout">Logout</router-link> 16 </li> 17 </template> 18 <!-- 未ログインなら非表示 --> 19 <template v-if="!auth"> 20 <li class="nav-item"> 21 <router-link to="/login" class="nav-link">Login</router-link> 22 </li> 23 <li class="nav-item"> 24 <router-link to="/register" class="nav-link">Register</router-link> 25 </li> 26 </template> 27 </ul> 28 </nav> 29</template> 30 31<script> 32import { computed } from "vue" 33import { useStore } from "vuex" 34import { useRouter } from "vue-router" 35import axios from "axios" 36 37export default { 38 name: "Nav", 39 setup() { 40 const store = useStore() 41 const router = useRouter() 42 const auth = computed(() => store.state.auth) 43 44 //async 非同期関数 45 const logout = async () => { 46 alert("通過") //検証用(現在ここが表示されません) 47 48 axios.post('logout', {}) 49 store.dispatch('setaAuth', false) 50 router.push('/login') 51 } 52 return { 53 auth 54 } 55 } 56} 57</script>

index.ts

1//index.ts 2//vuexででログイン状態を管理しています 3 4import { Commit, createStore } from 'vuex' 5 6export default createStore({ 7 state: { 8 auth: false 9 }, 10 mutations: { 11 setAuth: (state: { auth: boolean }, auth: boolean) => state.auth = auth 12 }, 13 actions: { 14 setAuth: ({commit}: { commit: Commit }, auth: boolean) => commit('setAuth', auth) 15 }, 16 modules: { 17 } 18})

試したこと

・@clickをv-onの表記に変更してみる

補足情報(FW/ツールのバージョンなど)

@vue/cli 4.5.13

以下のサイトを参考にしました▼
Go言語とVue.jsで作るユーザー認証アプリ~フロントエンド開発編

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

return の中に logout を加えてください

js

1setup () { 2 ... 3 return { 4 auth, 5 logout 6 } 7}

投稿2021/09/28 12:13

neko_daisuki

総合スコア2090

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wepowepon

2021/09/29 07:04 編集

neko_daisuki様 コメントありがとうございます。 頂いた方法で解決しました。解決できずに困っておりましたので、大変助かりました。 もし宜しければ、今後の参考にさせていただきたくどのような思考で導いたのか、ポイントを教えていただけないでしょうか? setup関数内に登場させた非同期関数に関してはreturnに含めないと発火しないという文法的な問題でしょうか?
neko_daisuki

2021/09/29 07:24

template の中から @click や v-model などで指定する変数やメソッドは すべて return に含める必要があります。async の有無は関係ないはずです。 自分もハマったことがあるので分かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問