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

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

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

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

JavaScript

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

Q&A

1回答

1094閲覧

vue.jsで動的に書き出したバナーをマウスオーバーするとズームアップさせたいが、うまく動作しない

kutu

総合スコア257

Vue.js

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

JavaScript

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

0グッド

0クリップ

投稿2021/10/08 08:42

お世話になっております。
表題の件を実行したいのですが、うまく動作しません

下記の処理で<img>の部分をマウスオーバーすると
{{ banner_zoom_flag[banner_per_block * key + key_img] }}
の部分が更新されません(trueが表示されない)。なお
{{ banner_per_block * key + key_img }}
には正しい数値が表示されます。結果からすると
banner_zoom_flag[banner_per_block * key + key_img]
が更新されていない、又は更新はされていてもDOMの部分に伝わっていないかと思われますが、おわかりになる方いらっしゃいましたらよろしくお願いします。

vue1

1<div 2 class="banner_block" 3 v-for="(event_list, key) in event_list_block" 4 :key="key" 5> 6 <span v-for="(event, key_img) in event_list" :key="key_img"> 7 {{ banner_per_block * key + key_img }}: 8 {{ banner_zoom_flag[banner_per_block * key + key_img] }} 9 <img 10 :src="event.banner_uri" 11 v-on:mouseover="mouseover_image(banner_per_block * key + key_img)" 12 v-on:mouseout="mouseout_image(banner_per_block * key + key_img)" 13 v-bind:class="{ 14 banner_zoom: banner_zoom_flag[banner_per_block * key + key_img], 15 }" 16 /> 17 </span> 18</div>

vue2

1data() { 2 return { 3 //バナーを1ブロックにいくつ表示するか 4 banner_per_block: 4, 5 //バナーをズームアップ表示するかフラグ 6 banner_zoom_flag: [], 7 }; 8},

vue3

1mouseover_image: function (key) { 2 this.banner_zoom_flag[key] = true; 3},

css

1.banner_zoom { 2 position: absolute; 3 width: 100% !important; 4 height: 100% !important; 5 z-index: 20 !important; 6}

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

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

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

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

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

surface_0

2021/10/08 10:24

CSSでマウスオーバー時の見た目変化を与えるのが実質的な目的ではなく、 マウスオーバーイベントをVueにかませて何かをしたいというのが目的でしょうか? 単にクラスのオンオフだけならCSSだけで達成できる程度の事では?と思ったのでお聞きしました。
kutu

2021/10/11 00:41

はい。 マウスオーバーイベント時にvueで判断して、様々な動作(今回の例ではCSSの付与)を行おうとしたのですが、ますオーバーの瞬間に ・banner_zoom_flag[banner_per_block * key + key_img] の値が切り替わるということが発生せず、CSSの即座の切り替えができませんでした。
surface_0

2021/10/11 04:18

わかりました。 event_list_block の内容例を提示していただけませんか?
guest

回答1

0

データ内容をいただいてから答え合わせしようかと思いましたが、原因はほぼ明確だと思うので先に回答してしまいます。

配列の変更は検知できないパターンがあります。
リアクティブの探求 — Vue.js

mouseout_image()は次のようになっていると想定した場合の解決方法を以下に挙げます。

js

1mouseover_image: function (key) { 2 this.banner_zoom_flag[key] = false; 3},

例1 配列を初期化しておく

配列の要素が増減しないのであれば、data()で先にbanner_zoom_flagの中身を初期化しておきます。

js

1 data() { 2 const event_list_block = [ 3 // 省略 4 ]; 5 const banner_per_block = 4; 6 const banner_zoom_flag = []; 7 8 event_list_block.forEach((event_list, key) => { 9 event_list.forEach((event, key_img) => { 10 banner_zoom_flag[banner_per_block * key + key_img] = false; 11 }); 12 }); 13 14 return { 15 banner_per_block, 16 event_list_block, 17 banner_zoom_flag, 18 }; 19 },

例2 Vue.set()を使う

Vue.set()を使えば明示的に更新を促せます。

js

1 methods: { 2 mouseover_image: function (key) { 3 this.$set(this.banner_zoom_flag, key, true); 4 }, 5 mouseout_image: function (key) { 6 this.$set(this.banner_zoom_flag, key, false); 7 }, 8 },

蛇足

引数に真偽値も含めれば関数は一つで済みます。

html

1<img 2 :src="event.banner_uri" 3 v-on:mouseover="mouseover_image(banner_per_block * key + key_img, true)" 4 v-on:mouseout="mouseover_image(banner_per_block * key + key_img, false)" 5 v-bind:class="{ banner_zoom: banner_zoom_flag[banner_per_block * key + key_img] }" 6/>

js

1mouseover_image: function (key, flag) { 2 this.$set(this.banner_zoom_flag, key, flag); 3},

投稿2021/10/11 07:50

surface_0

総合スコア497

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問