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

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

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

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

Router

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

Q&A

解決済

1回答

3183閲覧

router-linkやrouter.pushし画面遷移した際に元の画面を消す方法について

widget11

総合スコア221

Vue.js

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

Router

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

1グッド

2クリップ

投稿2021/04/15 18:32

一部コードが長くなるため簡略させていただいております。

問題

router-linkやrouter.pushを使うことでvue-routerで定義したパスに遷移することができると思います。
しかしこれはどちらかというと遷移というより、
DOMを書き換える(router-viewタグを記載している箇所に描画)といった挙動に近いと思います。

以下のコードのようにそのままrouter.pushをした場合は遷移前の画面が残ってしまうため、v-ifディレクティブを用いてis_showというプロパティがfalseになった場合は遷移前の画面を消すという処理を記載しています。

しかしrouter-linkを使った場合、このis_showプロパティをどうやったらfalseにできるかがわかりません。
router.pushの場合はjs内で遷移前にfalseにするというコードを記載できるのですが、router-linkの場合はどうすれば良いか分からず仕舞いです。

またこのようなv-ifディレクティブを使わずとも遷移前の画面を消す良い方法があるのでしょうか?
ご回答いただけると幸いです。

コード

<template> <div> <router-link to="/sign_up">登録</router-link> <div id="login" v-if = "is_show"> <el-form>          <!-- 省略 --> <el-button type="primary" @click="onSubmit" >ログイン</el-button> </el-form> </div> <router-view></router-view> </div> </template> <script> import axios from 'axios'; export default{ data: function() { return{           //省略 is_show: true } }, methods: { onSubmit: function() { axios .post("http://localhost:3000/api/v1/auth/sign_in", {           //省略 }) .then((response) => { this.is_show = false; this.$router.push({ path: '/user_page' }); }) } } } </script>
shinoharat👍を押しています

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

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

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

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

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

shinoharat

2021/04/16 07:54

提示されているコードはルートコンポーネントに当たると思うのですが、そこに <router-view></router-view> があるのは何故でしょうか?
guest

回答1

0

ベストアンサー

またこのようなv-ifディレクティブを使わずとも遷移前の画面を消す良い方法があるのでしょうか?

単純に、遷移したときに消したいものはビューコンポーネントに入れてしまえば良いと思うのでですが、そうできない理由などがあるのでしょうか?
(質問者さんがどうして困っているのか、あまり理解できていません。)

質問者さんの求める回答に沿っているか分かりませんが、サンプルアプリを作成しました。

https://codesandbox.io/s/competent-lalande-1tn82?from-embed

参考になれば幸いです。
一応、サンプルアプリから一部抜粋したコードを↓にも載せます。

--

■ ルートアウトレット

ここには、画面遷移後も残したいものだけを記述します。
(共通のヘッダー・フッターなど)

index.html

1 <div id="app"> 2 <!-- 遷移後も消したくないものだけここに書く --> 3 <h1>サンプルアプリ</h1> 4 <router-link to="/">Top</router-link> 5 6 <!-- 遷移後に消したいものは router-view に描画する --> 7 <router-view></router-view> 8 </div>

--

■ ルーティング

ルートとビューコンポーネントをマッピングしています。
特別なことはしていません。

main.js

1import Vue from "vue"; 2import VueRouter from "vue-router"; 3 4import Login from "./Login.vue"; 5import SignUp from "./SignUp.vue"; 6import UserPage from "./UserPage.vue"; 7 8const router = new VueRouter({ 9 routes: [ 10 { path: '/', component: Login }, 11 { path: '/login', component: Login }, 12 { path: '/sign_up', component: SignUp }, 13 { path: '/user_page', component: UserPage }, 14 ] 15}) 16 17Vue.use(VueRouter); 18 19new Vue({ 20 router 21}).$mount("#app");

--

■ ビューコンポーネント

ログイン画面用のビューコンポーネントです。
is_show 関連のコードはすべて削除しています。
特に追加したコードはありません。

Login.vue

投稿2021/04/20 09:02

shinoharat

総合スコア1676

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問