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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1338閲覧

vue-routerで遷移した際、再描写を行いたい

shimeji_XX

総合スコア42

Vue.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/12/16 00:16

編集2021/12/16 02:59

##やりたいこと
画面Aに2つのボタンがあり、押したボタンのIDを画面Bに渡します。
画面BではIDを取得し、v-ifで描写するエリアを決めます。

##現在起こっている問題
画面Bに遷移した際v-ifが反応しません。画面BでF5を押し更新した場合、v-ifが反応して描画されます。

##試したこと
https://qiita.com/computer-penguin/items/658696b27ac57f977d88
https://qiita.com/naoiwata/items/d0ed1f7c2b2718dc94c3
こちらを参考に<script>にbeforeRouteUpdateを実装しようと試してみましたが、
beforeRouteUpdateの書き方が分からず上手くいきませんでした。

##ソースコード
####A画面

vue

1<template> 2 <div class="container"> 3 <h1>メニュー</h1> 4 <td> 5 <router-link v-bind:to="{name: 'no.select', params: {taskId: 1}}"> 6 <a class="btn-square">1. A処理</a> 7 </router-link> 8 </td><p> 9 <td> 10 <router-link v-bind:to="{name: 'no.select', params: {taskId: 2}}"> 11 <a class="btn-square">2. B処理</a> 12 </router-link> 13 </td> 14 </div> 15</template> 16 17<script> 18 export default {} 19</script> 20 21<style scoped> 22</style>

####B画面

vue

1<template> 2 <div class="container"> 3 <h1>コード入力</h1> 4 <h2> 5 <p>[ 01 ~ 20 ]</p> 6 <p>コードを入力</p> 7 </h2> 8 <input @input="validate" v-model="numValue"> 9 <p> 10 <td> 11 <div v-if="this.$route.params.taskId==='1'"> 12 <router-link v-bind:to="{name: 'A.select', params: {taskId: 1}}"> 13 <a class="btn-square">A処理入力画面へ進む</a> 14 </router-link> 15 </div> 16 <div v-else-if="this.$route.params.taskId==='2'"> 17 <router-link v-bind:to="{name: 'B.select', params: {taskId: 1}}"> 18 <a class="btn-square">B処理入力画面へ進む</a> 19 </router-link> 20 </div> 21 <div v-else> 22 想定外のアクセスです。トップページに戻ってください。 23 </div> 24 </td> 25 </div> 26</template> 27 28<script> 29 export default {} 30</script> 31 32<style scoped> 33</style>

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

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

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

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

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

guest

回答2

0

自己解決

自己解決しましたので記載いたします。

B.vueにbeforeRouteEnterイベントでv-ifの要素を変更することで描画します。
あまり綺麗なコードではないので参考程度にお願いします。

vue

1<template> 2 <div class="container"> 3 <h1>コード入力</h1> 4 <h2> 5 <p>[ 01 ~ 20 ]</p> 6 <p>コードを入力</p> 7 </h2> 8 <input @input="validate" v-model="numValue"> 9 <p> 10 <td> 11 <div v-if=view1> 12 <router-link v-bind:to="{name: 'A.select', params: {taskId: 1}}"> 13 <a class="btn-square">A処理入力画面へ進む</a> 14 </router-link> 15 </div> 16 <div v-if=view2> 17 <router-link v-bind:to="{name: 'B.select', params: {taskId: 1}}"> 18 <a class="btn-square">B処理入力画面へ進む</a> 19 </router-link> 20 </div> 21 <div v-if=view3> 22 想定外のアクセスです。トップページに戻ってください。 23 </div> 24 </td> 25 </div> 26</template> 27 28<script> 29 export default { 30 data(){ 31 return { 32 view1:false, 33 view2:false, 34 view3:true 35 } 36 }, 37 beforeRouteEnter(to, from, next) { 38 next((vm) => { 39 vm.initialize();// 画面が表示された時の処理を呼び出します。 40 next(); 41 }); 42 }, 43 methods: { 44 /** 初期化(最初にコンポーネントが読まれる時、ページ全体を更新する時に呼ぶ) */ 45 initialize() { 46 this.view1 = false; 47 this.view2 = false; 48 this.view3 = false; 49 if(this.$route.params.taskId==='1'){ 50 this.view1 = true; 51 }else if (this.$route.params.taskId==='2'){ 52 this.view2 = true; 53 }else{ 54 this.view3 = true; 55 } 56 }, 57 } 58 } 59</script> 60 61<style scoped> 62</style>

投稿2021/12/21 23:29

shimeji_XX

総合スコア42

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

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

0

こっちの方の情報を参考に作成された方がいいと思います。

Vue-router を使ったときに URL は変わったのに画面に反映されないとき

時間がないので検証はしてないですが、こういう流れになっているようです。

a.vue(親コンポーネント A)

vue

1} 2 beforeRouteUpdate (to, from, next) { 3 // URL の id が変わったときに src/components/b.vue の b_hoge関数を実行してモデルを更新する 4 this.$refs.items.b_hoge(); //子コンポーネントの受取メソッド 5 next(); //次のフックに移動するメソッド 6 } 7}

b.vue(子コンポーネント B)

vue

1/*@props制御も忘れないように*/ 2methods{ 3 b_hoge(){ 4 return getCurrentItem(this.$route.params.to); //親コンポーネントから取得したv-bindディレクティブ 5 } 6}

これを、今回のv-bind:to={…}に受け渡そうとしているオブジェクトに当てはめてみればいけるのではないかと。

投稿2021/12/16 09:49

FKM

総合スコア3633

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

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

shimeji_XX

2021/12/17 03:11

回答ありがとうございます。 a.vueで<v-bind:to={...}>のリンクをクリックしたときにbeforeRouteUpdateが発火するという認識でよろしいでしょうか? 初心者過ぎて変なことを言っていたら申し訳ございません。 beforeRouteUpdateの中にconsole.logを入れてみたのですが、出力されず、beforeRouteUpdateがどのタイミングで動作するのか分かっていません。
shimeji_XX

2021/12/21 01:03

色々検証してみてやっと分かりました。 提案された方法は#~~~が変わる実装なのでbeforeRouteUpdateが動くということが分かりました。 /aaaから/bbbに遷移した際はbeforeRouteUpdateは動きません。 引き続き情報を募集いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問