質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.49%
Vue.js

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

Router

Routerは、異なるネットワーク同士を相互に接続するための通信機器。インターネットでのデータを自動的に振り分け、一つのインターネット回線を複数のコンピュータで使用することが可能です。DHCPによりIPアドレスを自動的に割振りすることもできます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

解決済

1回答

2845閲覧

vue.js ログイン前とログイン後でheader表示を変えたい

widget11

総合スコア221

Vue.js

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

Router

Routerは、異なるネットワーク同士を相互に接続するための通信機器。インターネットでのデータを自動的に振り分け、一つのインターネット回線を複数のコンピュータで使用することが可能です。DHCPによりIPアドレスを自動的に割振りすることもできます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

0クリップ

投稿2021/05/10 07:09

Homeというコンポーネントに子コンポーネントとしてヘッダーというコンポーネントを置いております。
ヘッダーコンポーネントにはログインと登録という名前付きリンクがあり、Homeコンポーネントのrouter-viewで描画されます。

ここからが本題でこのHeaderにはログインコンポーネントが描画されログインがおこなるのですが、ログイン後遷移した際にHeaderをログイン、登録からログアウトという表示に切替えたいのですがうまく切り替える方法がわかりません。

一応header.vueの表示ロジックとしては、(これを認証している証明にしているのもどうかと思うのですが)
localstorageから認証tokenを取得し、もしnullならログインしてないのでfalse、あればログインしているのでtrueを返しlogin_flagに代入。
login_flagの状態をみて、ログイン、登録のリンクを出すかログアウトボタンを出すかを記載しています。

しかしこのロジックをcreated()に記載している為、ログインしている状態でリロードした際はログアウトボタンが出るのですが、
ログイン後vue-routerで遷移した際はインスタンスが新規に作成される訳ではないので、ログインを行ってもログインや登録のヘッダーが出たままになってしまいます。

何かrouter.pushなどで画面遷移が起こった際に、このcreatedの中に記載してるロジックを発火させたいのですがどうすればよいでしょうか?

ソースコードは以下になります。
お手数おかけしますがよろしくお願いします。

//Home.vue <template> <div id="home"> <Header/> <main class="container mt-4"> <router-view></router-view> </main> </div> </template> <script> import Header from './header' //省略 components: {  Header }, } </script>
//Header.vue <template> <div id="header"> <header class="navbar navbar-dark bg-dark" role="navigation"> <div v-if = "is_login === false"> <div class="navbar-header navbar-left pull-left"> <div class="navbar-brand">Performa</div> </div> <div class="navbar-nav ml-4"> <router-link to="/" class="nav-link">Top</router-link> </div> <div class="navbar-nav ml-4"> <router-link to="/sign_in" class="nav-link">ログイン</router-link> </div> <div class="navbar-nav ml-4 mr-auto"> <router-link to="/sign_up" class="nav-link">登録</router-link> </div> </div> <div v-else-if = "is_login === true"> <div class="navbar-nav ml-4 mr-auto"> <button v-on:click="sign_out" >ログアウト</button> </div> </div> </header> </div> </template> <script> import axios from 'axios'; import SignIn from '../entries_views/sign_in' import SignUp from '../entries_views/sign_up' export default { name: "header", data: function() { return{ is_login: null, } }, components: {  SignIn, SignUp }, created() { let id = localStorage.getItem("token"); this.is_login = id == null ? false : true; alert(this.is_login); } } </script>
//sign_in.vue <template> <div> <div id="login"> <el-form> <el-form-item label="メールアドレス" prop="email"> <el-input id="email" type="email" v-model="email" autocomplete="off"></el-input> </el-form-item> <el-form-item label="パスワード" prop="password"> <el-input id="password" type="password" v-model="password" autocomplete="off"></el-input> </el-form-item> <el-button type="primary" @click="onSubmit" >ログイン</el-button> </el-form> </div> <router-view name="user_page"/> </div> </template> <script> import axios from 'axios'; axios.defaults.headers.common = { 'Content-Type': 'application/json', }; export default{ data: function() { return{ id: '', email: '', password: '', uid: "", access_token: "", client: "", expiry: "", } }, methods: { onSubmit: function() { axios .post("http://localhost:3000/auth/sign_in", { email: this.email, password: this.password, }) .then((response) => { localStorage.setItem("id",response.data.data["id"]); localStorage.setItem("token",response.headers["access-token"]); localStorage.setItem("uid", response.headers["uid"]); localStorage.setItem("token-type", response.headers["token-type"]); localStorage.setItem("client", response.headers["client"]); localStorage.setItem("expiry", response.headers["expiry"]); this.$router.push({ path: '/user_page' }); }) .catch(error => { alert(error); }) } } } </script>

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

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

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

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

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

guest

回答1

0

自己解決

watchを使ったら解決しました

投稿2021/05/11 03:43

widget11

総合スコア221

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問