【Nuxt3】v-bindで使用する変数や関数に「ー」ハイフンを入れる理由

おはようございます。そうすけです。

運営者:そうすけ


30代のブロガーとエンジニア。
工場勤務→情シス→ソフトウェアエンジニア
主にフロントエンド開発を行っています。

趣味はガジェットと植物

NuxtやVue初心者がv-bindを学習するとき、表示の仕方に違和感を感じることがあります。

scriptタグ内の変数をバインドさせようとしたとき、宣言した変数にハイフンがついた形でないとエラーがおきるのです。

例えば下記のケース。

下記はinde.vueにModeswitcherというカスタムコンポーネントを設置し、v-bindでindex.vueの値をModeswitcherへPropsとして送っています。

<template>
<ModeSwitcher :dark-or-empty="mode" :switch-mode="switchMode"></ModeSwitcher>  
</template>

<script setup lang="ts">
const switchMode = () =>{
  mode.value =mode.value? "" :"dark";  
}
</script>
<template>
<button @click="switchMode">
    {{ darkOrEmpty ||"light"}}mode
</button>
</template>


<script lang="ts" setup>
defineProps<{
    darkOrEmpty:string|null;
    switchMode:()=>void;
}>();
</script>

Modeswitcherでは
darkOrEmpty、switchMode
と宣言している変数です。

しかし、v-bindして使用する際、
:dark-or-empty:switch-mode
とハイフンを入れた形で記述します。

そのまま記載するとエラーになります。

目次

なぜこうなるの?

VUEファイルがVueは自動でキーをキャメルケースからケバブケースに変換します。
VUEをコンパイルした時にhtmlがケバブケースしか理解できないためです。

Vue.js において、:dark-or-empty=”mode” のような記法を使用する場合、そのプロパティはケバブケース(kebab-case)で指定する必要があります。

Javascriptで宣言したキャメルケースはHTMLのタグとして読み取れないのです。

要するに、コンポーネントのPropsでDarkOrEmptyと定義した変数は、HTML側にdark-or-emptyというハイフン付きの記載にすると、HTML側がJavascriptとして認識されるということです。

Vue.js はこの HTML の属性としてのケバブケースを、コンポーネント内で定義されたキャメルケースのプロパティに正しくバインディングして処理します 

そもそもケバブケースとかってなに?

それぞれの記法の説明と用途について。

ケバブケース 

文字と文字の区切りを-で表現するやり方。「チェインケース」とも言う。 
ケバブのお肉をぶっさしている感じからきているとか 

this-case-is-god 

props 属性は「ケバブケース」 その他は「キャメルケース」 

<template> 
<MyComponent :my-data="hoge"></MyComponent>  
</template>  

<script>  
export default { props: ['myData'], }  
</script>

Emitは「ケバブケース」 

<script>  
export default { methods: { hogeFunc() { this.$emit('my-emit') } } }  
</script>

公式にも記載があります。

キャメルケース 

文字と文字の区切りを大文字で表現するやり方。 
よく見るやつです。ラクダのこぶですね 

thisCaseIsGod 

パスカルケース 

文字と文字の区切りを大文字で表現+先頭の文字も大文字にする。 
それもそのはず、「アッパーキャメルケース」とも呼ばれるのだから。 
これもよく見ますね 

ThisCaseIsGod 

コンポーネントは「パスカルケース」 

<template> 
<MyComponent></MyComponent> 
</template>

まとめ

Vue コンポーネント内で defineProps を使用してプロパティを定義する際には、キーはキャメルケース(camelCase)で指定します。

しかし、HTML の属性としてこれを使う場合、ケバブケースが推奨されます。

Vue.js は内部的にこれらのスタイルを変換して処理するため、プロパティの命名スタイルを揃えることが望ましいです。 

具体的には、darkOrEmpty というプロパティを dark-or-empty として HTML 上で使用しているため、このようなハイフンを含んだケバブケースの表現が必要です。 

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次