時給単価UP【3大特典付き】
コーディングテクニック集100選⋙

【解説】Vue.jsのpropsの使い方・バリデーション【defineProps】

記事内に広告を含みます

パソ君
パソ君

・Vue.jsのpropsの使い方は?

こんな疑問にお答えします。

Vue.jsのpropsとは、親コンポーネントから子コンポーネントにデータを渡すための仕組みのこと。

propsを使うことで、再利用性とメンテナンス性が向上します。

そのためかなり便利。

今回は自分用のメモとしてpropsについてまとめてみました!

ジト
ジト

参考にどうぞ

ということで、この記事では「Vue.jsのpropsの使い方」について解説していきます!

この記事でわかること

・Vue.jsのpropsの使い方
・Vue.jsのpropsの注意点など
・Vue.jsのdefinePropsのバリデーション

【最新】Vue.jsの入門にオススメの本【3選】 【最新】Vue.jsの入門にオススメのUdemy教材【3選】

【解説】Vue.jsのpropsの使い方【defineProps】

実際にpropsを使ったサンプルコードがこちら↓

<script setup lang="ts">
import TestVue from './components/TestVue.vue';
import { ref } from 'vue';

const fruitItem = ref('りんご');

</script>

<template>
  <!-- バインドする場合 -->
  <TestVue :fruit="fruitItem"/>
  <!-- 文字列の場合 -->
  <TestVue fruit="オレンジ"/>
</template>

上記の子コンポーネントタグに属性をつけていますよね。

それが下記の{{ fruit }}の中で出力されます。

<script setup>
defineProps(['fruit'])
</script>

<template>
  <p class="text">私の好きな果物は{{ fruit }}</p>
</template>

こんな感じで親→子にデータを渡せるのがpropsとなります。

propsの使い方として重要な点がこちら↓

①:子で「defineProps」関数を使う

②:子で「defineProps」にpropsを定義する

③:子でpropsの表示部分を作成

④:親で子コンポーネントのタグに属性として設定

⑤:親から子にデータが引き渡され表示される

順に解説してきます。

➀:子で「defineProps」関数を使う

まず用意されている「defineProps」という関数を呼び出します。

<script setup>
defineProps([])
</script>

引数に配列[]を入れます。

➁:子で「defineProps」にpropsを定義する

その配列の中に、引き渡すデータの属性の名前を記述します。

<script setup>
defineProps(['fruit'])
</script>

今回は例としてfruitという名前を定義しました。

➂:子でpropsの表示部分を作成

引き渡すデータの値を出力する場所を、子コンポーネントに記述しておきます。

例として下記のように作成しました。

<template>
  <p class="text">私の好きな果物は{{ fruit }}</p>
</template>

これで準備完了です。

④:親で子コンポーネントのタグに属性として設定

後は親コンポーネントから、引き渡す値を記述すればOK。

下記のようにコンポーネントタグに対して、「定義した属性名+引き渡す値」を記述します。

<!-- バインドする場合 -->
<TestVue :fruit="fruitItem"/>

<!-- 文字列の場合 -->
<TestVue fruit="オレンジ"/>

ちなみに値にはリアクティブ変数をバインドしたり、文字列で記述することが可能です。

ジト
ジト

バインドする場合は「:」を忘れずに。

今回は例として親コンポーネントに、下記コードのように記述しました。

<script setup lang="ts">
import TestVue from './components/TestVue.vue';
import { ref } from 'vue';
const fruitItem = ref('りんご');
</script>

<template>
  <!-- バインドする場合 -->
  <TestVue :fruit="fruitItem"/>
  <!-- 文字列の場合 -->
  <TestVue fruit="オレンジ"/>
</template>

⑤:親から子にデータが引き渡され表示される

すると親で記述した値が子コンポーネントに引き渡され、下記のように表示されます。

これが基本的なpropsの使い方となります!

【解説】Vue.jsのpropsのその他の使い方や注意点【defineProps】

propsにはその他にも色々な使い方や、注意点があります。

それががこちら↓

・複数のpropsの指定

・propsの名前のルール

・スクリプトで使う方法

・ルート直下に継承されない

・読み取り専用のため子で指定不可

順に見ていきましょう。

複数のpropsの指定

propsは複数指定可能です。
書き方はこんな感じ↓

defineProps(['定義した名前','定義した名前'])

親から子への引き渡しも、下記のように記述できます。

<script setup>
defineProps(['fruit','drink'])
</script>

<template>
  <p class="text">私の好きな果物は{{ fruit }}</p>
  <p class="text">私の好きな飲物は{{ drink }}</p>
</template>
<TestVue fruit="オレンジ" drink="コーラ"/>

propsの名前のルール

propsで複数単語を使う場合、命名規則として下記があります。

子コンポーネント→キャメルケース

・親コンポーネント→ケバブケース

基本的にはこの書き方をするという感じです。

子コンポーネント→キャメルケース

子では複数単語の場合、キャメルケースで記述するのが基本的。

<script setup>
defineProps(['colorName'])
</script>

<template>
  <p class="text">私の好きな色は{{ colorName }}</p>
</template>

親コンポーネント→ケバブケース

親では複数単語の場合、ケバブケースで記述するのが基本的。

<template>
  <TestVue color-name="赤色"/>
</template>

スクリプトで使う方法

定義した属性の値を、スクリプトにて使いたい場合は「defineProps」の返り値を使えば可能です。

<script setup>
const props = defineProps(['fruit'])
console.log(props.fruit)
</script>

コンソールログを見ると下記のように値が出力されました↓

ルート直下に継承されない

コンポーネントタグに属性を記述すると、その直下のルート要素のタグが1つだったら通常継承されますよね。

ただdefinePropsの値はルート直下に継承されません。

つまり親ファイルでコンポーネントに記述した値は、子コンポーネントのルート直下のタグにつかないということです。

要するに下記コードの場合「drink=”コーラ”」という属性が、直下ルート要素のpタグには付与しないということ。

理由は「drink」がdefinePropsで定義されているからです。

<template>
  <TestVue fruit="オレンジ" drink="コーラ" id="test"/>
</template>
<script setup>
defineProps(['fruit', 'drink'])
</script>

<template>
  <p class="text">私の好きな果物は{{ fruit }}</p>
</template>

ただ「id=”test”」は通常通り継承されます。

こんな感じでdefinePropsで定義した値は、ルート直下に継承されないので注意しましょう。

【解説】Vue.jsのフォールスルー属性の使い方【無効化方法】

読み取り専用のため子で指定不可

propsは読み取り専用となります。

そのため子コンポーネントから、値を変更することができません。

そのため下記「props.fruit = ‘ぶどう’」のような記述はできないので注意しましょう。

<script setup>
const props = defineProps(['fruit'])
// NG
props.fruit = 'ぶどう'
</script>
ジト
ジト

親→子への一方通行ということだね。

【解説】Vue.jsのdefinePropsのバリデーション

propsにはバリデーションを指定することができます。

予期されたデータが引き渡されているか否かを、確認する機能のことです。

主な書き方やバリデーションの種類がこちら↓

defineProps({
  定義した名前: {
    キー: 値,
    キー: 値,
  },
  定義した名前: {
    キー: 値,
    キー: 値,
  }
})

・type

・default

・requierd

順に見ていきましょう。

バリデーション:type

「type」プロパティを使うことで、その値の型を設定することができます。

例としてこちら↓

defineProps({
  fruit: {
    type: Number
  },
  drink: {
    type: String
  }
})

指定した型と違う値が確認されたら、コンソールにてエラーがでます。

ちなみにtypeには「NumberStringBooleanArrayObject」などがありますよ。

バリデーション:default

「default」を用いることで、親で何も指定してない場合のデフォルト値を設定できます。

defineProps({
  fruit: {
    default: 'りんご'
  },
  drink: {
    default: 'コーラ'
  }
})

この場合、親で何も指定してないと出力部分に「りんご」「コーラ」が反映されます。

バリデーション:requierd

「requierd」を用いることで、親で値を記述するのが「必須か否か」を設定できます。

defineProps({
  fruit: {
    required: true
  },
  drink: {
    required: false
  }
})

「true」or「false」で指定可能です。

「true」なのに何も記述されないと、コンソールにてエラーがでます。

ちなみにdefaultとrequierdは一緒に使われることは少ないそう。

デフォルトの値があったら、必須設定はいらなくなりますからね。

【最新】Vue.jsの入門にオススメの本【3選】 【最新】Vue.jsの入門にオススメのUdemy教材【3選】

【解説】Vue.jsのpropsの使い方・バリデーション【defineProps】:まとめ

  • propsを使えば親から子にデータを引き渡すことが可能
  • propsが複数単語の場合、親と子で命名規則が異なる
  • propsは読み取り専用
  • バリデーションを使えば引き渡されるデータの型などの設定が可能
ジト
ジト

Vue.jsでpropsを使う時はためしてみてね!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA