などの疑問や悩みを解決してまいります。
プログラミング言語を学んでいる方であれば「if
文」を聞いたことはあるのではないでしょうか。
Vue.jsでも専用のif
文の指定をすることができ、これをv-if
ディレクティブと言います。
v-if
ディレクティブを使用することで簡単に条件分岐をさせることが可能です。
この記事ではv-if
ディレクティブについて解説していきます。
v-ifディレクティブとは
v-if
ディレクティブとは特定の条件が真(true
)である場合に、要素を表示するかどうかを指定します。
つまり、条件が満たされている場合にだけHTML要素が表示され、条件が満たされていない場合は非表示になります。
実際に使用例を見ていきましょう。
実際にv-ifディレクティブを使用してみよう
それでは実際に見ていきましょう。
今回2つのVueファイルを用意しました。ページに表示するApp.vueとコンポーネントファイルのPost.vueです。
<script setup lang="ts">
import Post from './components/Post.vue';
</script>
<template>
<div class="container">
<Post />
</div>
</template>
<script setup lang="ts">
import { ref,computed } from 'vue'
const inputValue = ref<string>('')
const lengthLimit: number = 10
const isValidName = computed(() => {
if (inputValue.value.length < lengthLimit) {
return true
} else {
return false
}
})
</script>
<template>
<div class="container">
<p>↓↓文字を入力してください。↓↓</p>
<input v-model="inputValue" type="text">
<p v-if="!isValidName" class="error">入力は{{ lengthLimit }}文字未満にしてください。</p>
</div>
</template>
こちらはinput
タグに入力した文字数が10文字以上となると赤字で注意書きが表示する仕組みになっています。
まず表示させたい要素にv-if
ディレクティブを指定しています。
v-if=""
内に条件式を記述し、その条件式がtrue
の場合はテキストを表示するというようにしていきます。
今回はref
とcomputed
を使用するので、Vueからimport
していきます。
import { ref,computed } from 'vue'
次にinput
タグに入力された値をリアクティブな値とするため、定数inputValue
にref
を指定します。
const inputValue = ref<string>('')
次に文字数の制限を設定します。今回は10文字に到達すると注意書きを表示させたいので、数字「10」を値とした定数lengthLimit
を作成します。
const lengthLimit: number = 10
次に条件式を作成していきます。
条件式には入力した内容が変更になる度にチェックしてもらうためcomputed
(計算プロパティ)を指定します。
次にinputValue.value.length < lengthLimit
として、入力した文字数よりが10未満の場合はtrue
を返し、10文字を超える場合はfalse
を返します。
この処理を定数isValidName
に入れています。
const isValidName = computed(() => {
if (inputValue.value.length < lengthLimit) {
return true
} else {
return false
}
})
そして定数isValidName
をv-if=""
に入れています。
<p v-if="!isValidName" class="error">入力は{{ lengthLimit }}文字未満にしてください。</p>
否定演算子を使用していますが、これにより「true
じゃなければ(つまりinputValue.value.length > lengthLimit
)」という条件を作ることができます。
v-elseディレクティブを使用したコード例
次にv-else
ディレクティブを使用した場合のコード例を紹介いたします。
v-else
ディレクティブはv-if
ディレクティブの条件式がfalse
の場合に表示させることができます。
実際に見てみましょう。
Post.vueの内容を以下のように変更しました。
<script setup lang="ts">
import { ref,computed } from 'vue'
const postContents = ref([])
const inputValue = ref<string>('')
const postButton = () => {
if (inputValue.value.length <= 0) {
alert('フォームに値を入力してください。')
} else {
const inputData = {
id: Math.random(),
description: inputValue.value
}
postContents.value.push(inputData)
inputValue.value = ''
}
}
const deleteButton = (id: number) => {
postContents.value = postContents.value.filter(t => t.id !== id)
}
const lengthLimit: number = 10
const isValidName = computed(() => {
console.log(isValidName.value)
if (inputValue.value.length < lengthLimit) {
return true
} else {
return false
}
})
</script>
<template>
<div class="container">
<h1>文字を入力して投稿しよう!</h1>
<div class="input_box">
<input v-model="inputValue" type="text">
<button v-on:click="postButton()" class="post_btn">投稿する</button>
</div>
<p v-if="!isValidName" class="error">入力は{{ lengthLimit }}文字未満にしてください。</p>
<p v-if="postContents.length <= 0" class="no_post">投稿がありません。</p>
<ul v-else>
<li v-for="postContent in postContents" :key="postContent.id">
<span>{{ postContent.description }}</span>
<button v-on:click="deleteButton(postContent.id)" class="delete_btn">削除</button>
</li>
</ul>
</div>
</template>
コードが長くなってしまいましたが、順に説明していきます。
このコードでは簡単な投稿アプリを作成しています。
フォームに文字を入力して、投稿ボタンをクリックするとその内容をリスト形式で表示することができます。
また削除ボタンをクリックするとその削除ボタンを押したリストの身を削除することもできるようにしています。
「投稿がありません。」は投稿されている内容がない場合に表示されるようにv-if
ディレクティブを使用しています。
条件式にはpostContents.length <= 0
としています。
<p v-if="postContents.length <= 0" class="no_post">投稿がありません。</p>
このif
文の条件式がfalse
の場合は、v-else
ディレクティブの内容を表示します。
<ul v-else>
<li v-for="postContent in postContents" :key="postContent.id">
<span>{{ postContent.description }}</span>
<button v-on:click="deleteButton(postContent.id)" class="delete_btn">削除</button>
</li>
</ul>
postContents
とはリアクティブな配列データとして定数を作成しています。
const postContents = ref([])
リアクティブな値に指定しているため、この値に何かしらの変更があった場合ページが再更新されます。
なので投稿があった場合に配列データpostContents
に値が追加されるようになっているため、ページが更新され投稿があるなしで「投稿がありません。」のテキストの表示非表示を切り替えています。
投稿ボタンがクリックされた場合に入力した内容が表示されるようになる処理はpostButton
関数になります。
const postButton = () => {
if (inputValue.value.length <= 0) {
alert('フォームに値を入力してください。')
} else {
const inputData = {
id: Math.random(),
description: inputValue.value
}
postContents.value.push(inputData)
inputValue.value = ''
}
}
まず最初にif
文でフォームに文字が入力されているかをチェックします。
入力がない状態で投稿ボタンをクリックされた場合に「フォームに値を入力してください。」というアラートが表示されるようにしています。
また投稿した内容は、オブジェクト型のデータinputData
に格納しています。
const inputData = {
id: Math.random(),
description: inputValue.value
}
最後に配列データpostContents
にはオブジェクト型のデータinputData
を追加しています。
postContents.value.push(inputData)
inputValue.value = ''
長くなってしまいましたが、以上がv-else
ディレクティブを使用した簡単な投稿アプリの紹介でした。