vue.jsの使い方の基礎＃３【v-if / v-else / v-else-if / v-show】

ドキュメントに沿って手を動かしたことを自分用教科書として書いていきます（条件付きレンダリングの部分）
[公式ドキュメント](https://v3.ja.vuejs.org/guide/conditional.html)とやっていることは基本的に同じです。

Vue.js基礎知識に関する記事を随時更新しています一覧はこちら。もしよければ参考にしてください。

https://qiita.com/kty000/items/c919e01fc0c118098eb9

#v-ifの使い方
`v-if`ディレクティブは条件に応じて描画したいときに使います。ディレクティブの式が真（true）を返す場合のみ描画します。
例えば以下のようなコードがあるとします。

```Index.vue
<template>
  <div>
     <p v-if="result">Hello</p>
  </div>
</template>

<script>
export default {
    data() {
        return {
            result: true
        }
    }
}
</script>
```
この場合の条件は`result`を見ています。trueになっていれば「Hello」が表示され、falseの場合は表示されません。

また、`v-if`は以下のように使用することで多くの要素を切り替えることができます。

```Index.vue
<template v-if="result">
  <div>
     <p>Hello</p>
  </div>
</template>

---　以下略　---
```

#v-elseの使い方
if文を書くときはelseの場合の処理を書きますよね。vueでは`v-if`に対してのelse処理として`v-else`ディレクティブが使用できます。

```Index.vue
<template>
  <div>
     <p v-if="result">trueです</p>
     <p v-else>true以外です</p>
  </div>
</template>

---　以下略　---
```
この場合、`result`がtrueの場合は「trueです」のみが表示され、それ以外の場合は「true以外です」が表示されます。


#v-else-ifの使い方
先ほどは`v-else`ディレクティブについて書きましたが、さらに条件分岐させたいときのelse-if処理について`v-else-if`ディレクティブが使用できます。また、複数回連結することもできます。

```Index.vue
<template>
  <div>
    <p v-if="type === 'A'">A</p>
    <p v-else-if="type === 'B'">B</p>
    <p v-else-if="type === 'C'">C</p>
    <p v-else>Not A/B/C</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      type: "D",
    }
  },
}
</script>
```
この場合、「Not A/B/C」のみが表示されます。

:::note warn
注意
v-else 要素と v-else-if 要素は、v-if または v-else-if 要素の直後になければなりません。それ以外の場合は認識されません
:::

#v-showの使い方
`v-if`と同じように条件的に要素を表示するための別のオプションとして`v-show`があります。

```Index.vue
<template>
  <div>
     <p v-show="result">Hello</p>
  </div>
</template>

<script>
export default {
    data() {
        return {
            result: true
        }
    }
}
</script>
```
この場合の`result`がtrueになっていれば「Hello」が表示され、falseの場合は表示されません。
`v-if`と使用方法は同じですが、`<template v-if="result">`という使用方法はできず、`v-else`や`v-else-if`も使用できません。



#v-ifとv-showの違い
`v-if`は**ディレクティブの式が真を返す場合のみ描画**されます。

式の結果が真の時は描画し、偽のときは破棄されるんですね。
例えば`v-else-if`と`v-else`で１０個連結したとしても、真になった１つだけが描画され、それ以外は描画されないということですね。切り替えられるまでの間再作成されるため**”リアルな条件レンダリング**というわけです。

　
`v-show`は**常に描画されて DOM に維持**されます。
要素は条件の真偽に関わらず常に描画され、シンプルな CSS ベースの切り替えとして保存されます。

試しに以下のコードを実行してみました。

```Index.vue
<template>
<div>
  <p v-if="result=='A'" class="if-sample">Aです<p/>
  <p v-if="result=='B'" class="if-sample">Bです<p/>
  <p v-if="result=='A'" class="show-sample">Aです<p/>
  <p v-if="result=='B'" class="show-sample">Bです<p/>
</div>
</template>

<script>
export default {
    data() {
        return {
            result: "A"
        }
    }
}
</script>

<style>
.if-sample {
    color: blueviolet;
}

.show-sample{
    color: darkcyan;
}
</style>
```

実行結果
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550109/7e940b40-94ef-e9dd-9353-9ed3455d30eb.png)


まずは`v-if`のところを見てみましょう。
①「Aです」は条件がtrueなので描画され、実際の画面にも表示されてます。
②「Bです」は条件falseなので`<!---->`となにもされていません。

続いて`v-show`のところを見てみましょう。
③「Aです」は条件がtrueなので描画され、実際の画面にも表示されてます。
②「Bです」は条件falseですが描画はされています。`display: none;`で表示をなくしています。

##v-ifとv-showの使い分け
ではどのように使い分ければいいのか？以下公式引用です。

>一般的に、v-if はより高い切り替えコストを持っているのに対して、 v-show はより高い初期描画コストを持っています。 そのため、とても頻繁に何かを切り替える必要があれば v-show を選び、条件が実行時に変更することがほとんどない場合は、v-if を選びます。


これ以降のドキュメントはまた別記事で進めたいと思います。
最後まで読んでいただきありがとうございます！