Open2
<script setup> のハマりポイント
<script setup>
とは
<script setup>
を使うことで、これが
<template>
<div>hello! {{ name }}</div>
</template>
<script lang="ts">
import { defineComponent } from vue
export default defineComponent({
setup() {
const name = 'my name'
return {
name
}
}
})
</script>
こう書けます!
<template>
<div>hello! {{ name }}</div>
</template>
<script setup lang="ts">
const name = 'my name'
</script>
記述量を大幅に減らすことができました。
少し使ってみて分かったことを以下に書いていきます。
props
を定義する
defineProps
を使う
<template>
<div>hello! {{ name }}</div>
</template>
<script setup lang="ts">
defineProps({
name: {
type: String,
required: true,
}
})
</script>
defineProps
は import
不要!
公式ドキュメントには下記のように書かれています。
defineProps と defineEmits は、<script setup> 内でのみ使用可能なコンパイラマクロです。インポートする必要はなく、<script setup> が処理されるときにコンパイルされます。
通常の関数とは異なり、コンパイル時に変換されるものなので import は不要のようです。
toRefs
の引数には使えない!
直接 <script> 内でリアクティブに props を利用しようと思い、こんな感じで書いてハマりました。
<template>
<div>hello! {{ name }}</div>
</template>
<script setup lang="ts">
import { toRefs } from 'vue'
const { name } = toRefs(defineProps({
name: {
type: String,
required: true,
}
}))
</script>
ブラウザのコンソールに下記のようなエラーが出ます。
ReferenceError: defineProps is not defined
下記のように修正するとOKです。
<template>
<div>hello! {{ name }}</div>
</template>
<script setup lang="ts">
const props = defineProps({
name: {
type: String,
required: true,
}
})
const { name } = toRefs(props)
</script>