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

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

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

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

JavaScript

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

Q&A

解決済

2回答

5398閲覧

vue-routerのライフサイクルフックについて

arw.tyx-out_mz

総合スコア27

Vue.js

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

JavaScript

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

0グッド

0クリップ

投稿2018/03/28 15:23

前提・実現したいこと

vue-routerのライフサイクルフックについて知りたいです.

具体的には,<router-view></router-view>の部分がルーティングにより変化する仕様にしているのですが,各ルーティングにおけるコンポーネントの高さを取得したいです.

該当のソースコード

<template> <div> <headerItem></headerItem> <div class="wrapper"> <sidebarItem></sidebarItem> <div class="contents" ref="contents"> <div class="maincontents"> <router-view></router-view> </div> </div> <div class="float_clear"></div> </div> <footerItem></footerItem> </div> </template> <script> import HeaderItem from './HeaderItem.vue'; import SidebarItem from './SidebarItem.vue'; import FooterItem from './FooterItem.vue'; export default { components: { HeaderItem, SidebarItem, FooterItem, }, data () { return { height: {}, } }, methods: { getHeight() { var heightString = this.$refs.contents.clientHeight + 'px'; Vue.set(this.height, 'height', heightString); console.log(heightString); } }, mounted() { this.getHeight(); } } </script>

悩んでいること

上記のコードにおいて,mouted()フックで実行している処理を,ルーティング<router-view></router-view>が変化するたびに実行したいです.

どのフックを使用すればいいかご教示お願いします.

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

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

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

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

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

guest

回答2

0

ベストアンサー

ナビゲーション直後に何かするには$routewatchすればいいらしいです。
Fetching After Navigation - vue-router

ただその時点ではまだDOMの更新が完了していないので、$nextTickでそれが完了してから高さを取得するといいと思います。

DEMO(CodeSandbox)

投稿2018/03/30 06:48

karamarimo

総合スコア2551

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

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

arw.tyx-out_mz

2018/04/01 09:25

おお!素晴らしいです!ありがとうございます! nextTickって非同期対応はしていないですよね?
karamarimo

2018/04/01 10:27

非同期対応とは何でしょうか? $nextTick の引数の関数は非同期に実行されますが。
arw.tyx-out_mz

2018/04/01 10:35

説明不足ですみません. $nextTickはDOMの更新を待つとのことなので axiosで取得したレスポンスを元にHTMLを組み上げるといった処理は完了を待ってくれないかということをお聞きしたかったです.
karamarimo

2018/04/01 11:27

axiosで取得したあとdataを更新すると思いますがそのタイミングで $nextTick を使えばいいと思います。
arw.tyx-out_mz

2018/04/01 12:30

なるほど! じゃあ今回の場合, App.vueのテンプレートの中に<router-view>があるのですが, heightを取得しようとしている部分がApp.vueの中にあり,axiosでデータ取得をする部分が各<router-view>の中にある場合は取得は厳しそうですか? Vuexとかを用いないといけませんかね...
karamarimo

2018/04/01 12:59

なるほど、ナビゲーション時だけでなくrouter-viewのコンテンツが自分で高さを変えるというわけですね。 Vuexを使わないといけないということはないと思いますが、Vuexを使うとキレイになるのではないかと思います。もちろん高さ以外のデータを store で共有する必要はありません。 別の方法としては、Resize Observerを使うことです。これである要素のサイズが変わる度に何らかの処理をすることができます。ですが、今の所 chrome しか対応していませんので微妙です。 あるいは global event bus を用いるのもありかもしれません。 https://alligator.io/vuejs/global-event-bus/ ちなみに、もし他の要素の高さを合わせるためにjsで高さを取得しているなら、CSSだけで解決できるかもしれません。
arw.tyx-out_mz

2018/04/03 10:54

遅れてすいません! global event busを使用したらできました! ありがとうございます!
guest

0

ナビゲーションガードを使用しましょう。
私は beforeEach() で、画面ごとに表示出し分けを実装しました。

https://router.vuejs.org/ja/advanced/navigation-guards.html

投稿2018/03/29 08:54

pokkur

総合スコア76

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

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

arw.tyx-out_mz

2018/03/30 04:59

イメージがわかないです... やりたいこととしては, `App.vue`の中で`Sidebar`コンポーネントと`router-view`コンポーネントがあり,`router-view`コンポーネントのheightをその都度取得して`router-view`コンポーネントに渡すということがやりたいです. 自分の知識不足で大変申し訳ないですが,beforeEach()はrouterインスタンスを生成している場所に書くと思うので,単一ファイルコンポーネントである`App.vue`からは隔離されているのですが, `beforeEach()`内から別ファイルの`App.vue`内の`router-view`コンポーネントにアクセスし,そこから取得した`height`を`App.vue`に渡すということは可能なのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問