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

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

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

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

Router

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

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

JavaScript

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

Q&A

0回答

791閲覧

router-viewが切り替わったときにナビゲーションバーを再マウント・再描画させたい

oob

総合スコア0

Vue.js

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

Router

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

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

JavaScript

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

0グッド

0クリップ

投稿2020/10/15 15:01

編集2020/10/16 16:02

前提・実現したいこと

Vue CLIでVue Routerを使用した簡単なホームページを作っています。
画面上部には透明なナビゲーションバーがあり、スクロールした際に下に重なる背景の色によっては字が読みにくくなってしまうので、Intersection ObserverでNavigation.vueにclassを変更するpropsを渡し、暗い背景の時は字が白く、明るい背景の時は字が黒くなるようにしました。

こちらは問題なく実装できています。
暗い背景
↓スクロールする
明るい背景

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

初めてページを開くと問題なく動きます。
しかし、Routeで別ページに行くと、字が黒くなったままになってしまします。
イメージ説明
Routeが切り替わった時に、改めてIntersection Observerを設定し、再描画する必要かと思われますが、その方法がわかりません。
教えていただくと幸いです。よろしくお願いいたします。

該当のソースコード

App.vue

vue

1<template> 2 <div> 3 <navigation :isDark="isDark"/> 4 <router-view/> 5 </div> 6</template> 7 8<script> 9import navigation from '@/components/Navigation.vue'; 10export default { 11 components: { 12 navigation 13 }, 14 data() { 15 return {isDark: true} 16 }, 17 mounted() { 18 const options = { 19 root: null, 20 rootMargin: "-32px", 21 threshold: 0 22 } 23 const darkBackground = document.querySelectorAll('.dark-background'); 24 darkBackground.forEach(target => this.onIntersect(target, options)) 25 }, 26 methods: { 27 onIntersect(target, options = {}) { 28 const observer = new IntersectionObserver(this.addClass, options) 29 observer.observe(target) 30 }, 31 addClass(entries) { 32 for(const e of entries) { 33 if (e.isIntersecting) {this.isDark = true; 34 } else {this.isDark = false;} 35 } 36 } 37 } 38} 39</script> 40 41<style lang="scss"> 42// (省略) 43</style>

Navigation.vue

vue

1<template> 2 <header :class="{ lighten: isDark, darken: !isDark }"> 3 <div id="title"> 4 <h1>Navbar</h1> 5 </div> 6 <div id="nav"> 7 <router-link to="/">HOME</router-link> | 8 <router-link to="/about">ABOUT</router-link> 9 </div> 10 </header> 11</template> 12 13<script> 14export default { 15 name: 'navigation', 16 props: ['isDark'] 17 18} 19</script> 20 21<style lang="scss" scoped> 22header { 23 $light-text: #fff; 24 $dark-text: #000; 25// (中略) 26 transition: all 1s; 27 &.darken { 28 color: $dark-text; 29 a { 30 color: $dark-text; 31 transition: all 1s; 32 &.router-link-exact-active { 33 color: $dark-text; 34 text-decoration: underline; 35 } 36 } 37 } 38 39 &.lighten { 40 color: $light-text; 41 a { 42 color: $light-text; 43 transition: all 1s; 44 &.router-link-exact-active { 45 color: $light-text; 46 text-decoration: underline; 47 } 48 } 49 } 50 51} 52</style>

試したこと

  • routeをwatchし、routeが切り替わったときにkeyを子コンポーネント(Navigation.vue)に渡す
  • nextTickの使用

補足情報

参考にしたサイト:IntersectionObserverを使って要素の交差を検知してアニメーションさせる

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問