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

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

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

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

Q&A

1回答

1359閲覧

vue.jsのコンポーネントのtemplate表示タイミングについて。

kgi

総合スコア0

Vue.js

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

0グッド

0クリップ

投稿2021/06/06 01:13

編集2021/06/06 05:39

vue.jsのコンポーネントのtemplate表示タイミングについて。

商品画像一覧のようなサムネ等の画像表示にコンポーネント化してtemplate内にコードを書いているのですが

コンポーネントのtemplateのレンダリングがdomが終わったららしくて
表示されると共に、ページ全体縦幅がサムネ縦幅分、随時伸びていく感じになるのですが、
何か良い方法ありますでしょうか?

vue.jsを使わず、htmlでimg遅延ロードしている場合は
画像が表示される領域は最初からレンダリングされていて、遅延ロードでそこにただ当て込まれるため
上記のように、ページ全体縦幅がどんどん増えていくことはないです。

コンポーネントを使わずに, htmlと処理だけvueのインスタンス内 el:#app 等で処理を書けば
htmlは最初からある状態なので縦幅が増えることはないですが

コンポーネントでの何か対応があるのかを知りたいです。

環境はLaravel,blade,vue.jsです。

m2l さん

<template> <span class="lazyload thumb" v-bind:data-bg="'/storage/' + item.img" v-bind:style="{'height': height + 'px'}" ></span> </template> <script> export default { props: { item: { type: Object } }, data() { return { height: null, } }, methods: { pTop() { this.height = Math.floor((this.$el.offsetWidth / 10) * 7); } }, mounted() { this.pTop(); window.addEventListener('resize', this.pTop) }, beforeDestroy: function () { window.removeEventListener('resize', this.pTop) } } </script>

このような感じです。
レスポンシブに対応させているため、heightは随時計算させています。

htmlからは呼び出しは

<thumb-component v-bind:item="{{ $item }}" ></thumb-component>

このようにしてます。

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

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

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

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

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

guest

回答1

0

ライブラリ依存ではありますが、vue用の遅延ロードライブラリがありますのでそちらを使うと良いと思います。
参考のサイトもお載せいたします。
https://hafilog.com/lazyload

投稿2021/06/06 04:50

m2l

総合スコア318

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

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

kgi

2021/06/06 05:14

説明が足りなかったです。 vueの方でも遅延ロードはしております。 htmlで記載の場合サムネの枠にcssでwidth:100px、height: 60px等しているので 最初から枠が確保された状態でその枠の中に画像が収まるのですが vueのtemplateの場合dom完了するまでtemplateが反映されていないので cssも効かず、 レンダリングがされてから、上記でいう縦60px分の縦幅が追加されていく状態になってしまいます。 ガン、ガン、ガンとページが長くなっていくイメージです。
m2l

2021/06/06 05:20

大変失礼致しました。 該当のコードをお見せ頂けますとイメージしやすいのですがお見せ頂くことは可能でしょうか? (質問の編集から行えます。) また、vueのほうで親コンポーネントと子コンポーネントに分けている状態でimgタグのsrcをロードしているのであれば、その上位のhtmlタグのcssにmin-heightなど当て込む様にして頂ければ解決可能かと思います。
kgi

2021/06/06 06:10

記入いたしました。
m2l

2021/06/06 07:21

ご対応いただきましてありがとうございました。 頂いたソースコードをもとに少し記載してみました。 下記のような形では実現できるのかなとは思いました。 (頂きましたコードを基に再現しております。) https://codepen.io/masanori0209/pen/oNZdyyq templateの描画自体はprops要素の受け渡しができるタイミングではDOM生成されているはずなので、 thumb-componentの上位のほうで、itemが読み込み終わるまでDOMを隠す(v-if等)はされていないでしょうか?
kgi

2021/06/06 08:39

確認させていただきました。ありがとうございます。 v-if等はしておりません。 ちょっとわかりづらいですが、 ブラウザで横幅をものすごく細くして、縦幅を長くして ロードした瞬間に表示領域にスクロールがなく 画像が読み込まれてから縦幅が変わっているのでスクロールが表示される 表示の形式としては https://getbootstrap.com/docs/4.0/examples/album/ サムネと内容がセットになっている感じです。 youtubeのページのような感じです。 ほんの最初の一瞬なのでわかりづらいですが サムネが読み込まれる前に空の枠みたいな領域分です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問