発端
偉い人「このページは横画面でしか表示したくない」
蝦「はい」
環境
OS: windows10 64bit
node.js v10.16.3
Nuxt.js v2.10.2
イベントリスナーを追加
蝦「画面の向きが変わるたびにVueファイル内のdata()の値を変えてやればおk」
とりあえずMDNのサンプルをそのままつかう。
Window: orientationchange イベント - Web API | MDN
ebi.js
<script>
//中略
beforeMount() {
console.log("beforeMount");
window.addEventListener("orientationchange", this.checkRotate, false);
}
</script>
しかし
イベントリスナーが消えない。
「後はbeforeDestroy()でイベントリスナーを削除するように書けばおk」
kani.js
<script>
//中略
beforeDestroy() {
console.log("beforeDestroy");
window.removeEventListener("orientationchange", this.checkRotate, false);
},
</script>
消えない。
追加はされるが削除はされないので、該当ページに遷移するたびにイベントリスナーが増える。やばい
原因: beforeDestroy()もDestroy()も実行されてない
プリントデバッグしてみると、ページ離脱時にbeforeDestroy()もDestroy()も実行されてない。
再起動してもキャッシュを消しても実行されないという不思議。
解決策: ナビゲーションガードを使う。
どうにもならなくなったらbeforeRouteLeave(to, from, next)で削除すればおk。
ナビゲーションガード | Vue Router
Vue-Routerのナビゲーションガードを使ってみる - Qiita
uni.js
<script>
//中略
beforeRouteLeave(to, from, next) {
if (to.name) {
next();
window.removeEventListener("orientationchange", this.checkRotate, false);
return;
}
return;
},
</script>
別のプロジェクトでは再現しなかったので、多分もう使うことはほぼないだろうけど備忘録代わりに書いておく。
原因がわかる人がいたらだれか教えてください。