Vue.js及びJavaScript初心者です。実現したいことはなんとか形にはなったのですが、全く良い書き方とは思えず、潜在的な問題もあるかもしれません…。より効率的であったり、スマートな書き方があればご教示いただければ幸いです。
前提・実現したいこと
使用言語:Vue.js(2系), vue-router(v3.5.1)
2つのviewをタブで切り替えるWEBサイトを作っています。
どちらのviewも、Intersection Observer APIを用いて無限スクロールを実装しています。
さらに、無限スクロールで表示させるコンテンツは、各view共通の子コンポーネントを読み込んでいます。
このcreateObserver()という処理を、子コンポーネントである各コンテンツがmounted(createdでも可能?)された後に実行したいと思います。現状は、紆余曲折を経て、単純に500ms後に関数を呼び出すことで実現したい挙動はなんとかできています。。
// 親コンポーネント(view) <template> <div> 〜〜中略〜〜 <Post v-for="post in posts" :key="post.name" ></Post> </div> </template> <script> import Post from "../components/Post"; import { createObserver } from '../js/intersectionObserver'; export default { 〜〜中略〜〜 mounted() { setTimeout(() => { createObserver(); }, 500); }, 〜〜中略〜〜 } </script>
発生している問題・解決したいこと
この「500ms後に処理をする」という書き方よりも良い方法について、お知恵を貸していただきたいです。
この場合ですと、例えば通信環境が悪く読み込みに時間がかかっている場合などは期待する挙動にならないのではと思っています。
試したこと
- 初めsetTimeoutのmsを100msにしたところ、40%くらいの確率で望む挙動になり運頼みという不安定な状態でした。。現状なんの根拠もなく500msに設定しているので、それも良いのかわかりません。
- 非同期処理だ、と聞きかじった知識で思い浮かびはしたものの、
子コンポーネントがmountedになったら
という状態をどう取得し活用できるかも見当がつかず、試せていません。
わかりづらい点があれば恐縮ですが、何卒ご教授のほど宜しくお願いいたします!
解決方法
- $emitを使った方法
// 子 mounted() { this.$emit('is-post-mounted'); }, // 親 <Post @is-post-mounted="childDOMMounted"></Post> ~~ methods: { childDOMMounted() { createObserver(); } }
- $nextTickを使った方法
// 子 mounted() { this.$nextTick(() => { createObserver(); }) }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/17 23:55
2021/02/22 20:56