LoginSignup
1
0

More than 3 years have passed since last update.

[Vue]v-ifとv-forを同じタグ内に書いたら、v-ifが無視される件

Last updated at Posted at 2019-06-18

問題のコード

期待する挙動をしてくれないコード
<ul>
    <li v-if="objs.length" v-for="obj in objs">
        {{ obj }}
    </li>
    <li v-else>
        オブジェクトがないよ!
    </li>
</ul>

今回省略しているが、objsに何かオブジェクトが入っていたとして、それを「v-for」を使って「objs」を1つずつ「obj」に格納し、出力しているとします。
そして、同じliタグ内に「v-if」を書いていて、objsの個数がfalseのとき(つまりobjsの中身がないとき)、
pタグが出力される、という挙動を期待したとします。

実行すると…

このコードを実行しても、残念ながらpタグが出力されず、期待した挙動を行ってくれません。

v-forはv-ifより先に実行され、v-ifはそのまま素通りされる

実は、今回のv-if/v-forの両ディレクティブは、v-forの方が先に実行される、という特徴があります。

つまり、liタグの中で、v-ifより先にv-forが実行され、objsの中に何も入っていなかった場合は、もちろんここには何も出力されることはない。
そこで、liタグ内のv-ifを、それからでも実行してくれると良いのだが、残念ながらそうはいかず、liタグを抜けてしまい、pタグに入ってしまうそうな。
もちろん、v-ifの判定もしていないので、v-elseは素通りされ、結果的に何も表示されないという挙動になってしまうわけです。

代替案

期待する挙動をしてくれるコード
<ul v-if="objs.length">
    <li v-for="obj in objs">
        {{ obj }}
    </li>
</ul>
<ul v-else>
    オブジェクトがないよ!
</ul>

このように、v-ifを1階層上のタグに移すことで、対応できます。
ありがとうございました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0