<script setup>
์ Single-File-Component ๋ด์์ Composition API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ syntactic-sugar(๋ฌธ๋ฒ์ ์คํ) ์ ๋๋ค. SFC์ CompositionAPI๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ<script setup>
์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค. ์๋๋ฉด ์ผ๋ฐ<script>
๊ตฌ๋ฌธ๋ณด๋ค ๋ง์ ์ฅ์ ์ ์ ๊ณตํด์ค๋ค.
๐ syntactic-sugar๋ ๊ธฐ๋ฅ์ ๊ทธ๋๋ก์ธ๋ฐ ์ฝ๋ ์ฌ๋์ ์ํด ์ง๊ด์ ์ผ๋ก ์ฝ๊ฒ ์ฝ๋๋ฅผ ์ฝ์ ์ ์๊ฒ ๋ง๋ ๋ค๋ ๊ฒ์ด๋ค.
<script setup>
import { ref } from "vue";
// script์ setup์ ์ ์ธํ๋ฉด ๋๋ค.
console.log('Hi!');
//๋ฐ์ํ ๋ฐ์ดํฐ ๋ํ ์ ์๋ํ๋ค.
const message = ref("");
//๋ฐ๋ก return์ ํ์ง ์๋๋ผ๋ ์ฌ์ฉํ ์ ์๋ค. (์์ฉ๊ตฌ๋ฅผ ์ค์ผ ์ ์๋ค)
const msg = 'hi';
</script>
<script>
//์์ setup์ ์ฌ์ฉํ์ ๋ ์๋์ฒ๋ผ ์ปดํ์ผ๋๋ค.
export default {
import { ref } from "vue";
setup() {
console.log('Hi!');
const message = ref("");
const msg = 'hi';
return{ msg, message };
},
}
</script>
defineProps()
์defineEmits()
API๋ฅผ<script setup>
๋ด์ ์ ์ธํ์ฌprops
์emits
์ ์ฌ์ฉํ ์ ์๋ค.
<script setup>
const props = defineProps({
foo: String
})
const emit = defineEmits(['change', 'delete'])
</script>
defineProps
์ defineEmits
๋ <script setup>
๋ด๋ถ์์๋ง ์ฌ์ฉํ ์ ์๋ ์ปดํ์ผ๋ฌ ๋งคํฌ๋ก๋ค. ๊ทธ๋ ๊ธฐ์ import
ํ ํ์๊ฐ ์์ผ๋ฉด <script setup>
์ด ์ฒ๋ฆฌ๋ ๋ ์ปดํ์ผ ๋๋ค.defineProps
๋ props
์ต์
๊ณผ ๋์ผํ ๊ฐ์ ํ์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ defineEmits
๋ emits
์ต์
๊ณผ ๋์ผํ ๊ฐ์ ํ์ฉํ๋ค.defineProps
์ defineEmits
๋ ์ ๋ฌ๋ ์ต์
์ ๊ธฐ๋ฐ์ผ๋ก ํ์
์ถ๋ก ์ ์ ๊ณตํ๋ค.defineProps
์ defineEmits
์ ์ ๋ฌ๋ ์ต์
์ setup()
์์ ๋ชจ๋ ์์ญ(module scope)
์ผ๋ก ํธ์คํ
๋๋ค. ๋ฐ๋ผ์ ์ต์
์ setup()
์์ญ์ ์ ์ธ๋ ์ง์ญ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. ๋ง์ฝ ๊ทธ๋ ๊ฒ ํ๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ํ์ง๋ง import
๋ ์ต์
์ ์ฌ์ฉํ ์ ์๋ค. ์๋๋ฉด import
๋ ๋ชจ๋ ์์ญ์ผ๋ก ํธ์คํธ๊ฐ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
<script setup>
์ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก Template Refs๋ $parent์ ๊ฐ์ด ์ปดํฌ๋ํธ๊ฐ ํต์ ์ด ๋ซํ ์๋ค.<script setup>
์ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ์ ๋ด๋ถ ๋ฐ์ดํฐ๋ ๋ฉ์๋๋ฅผ ๋ช ์์ ์ผ๋ก ๋ ธ์ถํ๋ ค๋ฉดdefineExpose()
์ปดํ์ผ๋ฌ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
<script setup>
import { ref } from 'vue';
const a = 1
const b = ref(2)
defineExpose({
a,
b
})
</script>
expose๋ ์ผ๋ฐ < script >์์๋ ์ฌ์ฉํ ์ ์๋ค.
<script>
export default{
setup(props, context){
//Expose public properties (Function)
console.log(context.expose)
}
}
</script>
slots
๊ณผattrs
๋<template>
๋ด๋ถ์์$slots
๊ณผ$attrs
๋ก ์ง์ ์ ๊ทผํด์ ์ฌ์ฉํ ์ ์๋ค. ๋ง์ฝ<script setup>
๋ด๋ถ์์ slots๊ณผ attrs๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ๊ฐ๊ฐuseSlots()
,useAttrs()
helper ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
<script setup>
import { useSlots, useAttrs } from 'vue'
const slots = useSlots()
const attrs = useAttrs() // fallthrough ์์ฑ ์ ๊ทผ
</script>
slots
๊ณผ attrs
๋ ์ผ๋ฐ <script>
์์๋ ์ฌ์ฉํ ์ ์๋ค.
<script>
export default{
setup(props, context){
//Attributes (Non-reactive object, equivalent to $attrs)
console.log(context.attrs)
//Slots (Non-reactive object, equivalent to $slots)
console.log(context.slots)
}
}
</script>
<script setup>
์nomal <script>
์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์nomal <script>
๊ฐ ํ์ํ ์ ์๋ค.
<script setup>
์์ ํํํ ์ ์๋ inheritAttrs์ต์
์ด๋ Plugin์ ํตํด ํ์ฑํ๋ Custom ์ต์
์ ์ฌ์ฉํ๊ณ ์ ํ ๋ nomal <script>
๋ฅผ ํจ๊ป ์ ์ธํฉ๋๋ค.named export
๋ฅผ ์ ์ธ ํ์ ๋(์: export const data
)<script>
//์ผ๋ฐ ์คํฌ๋ฆฝํธ, ๋ชจ๋ ๋ฒ์์์ ํ ๋ฒ๋ง ์คํ
runSideEffectOnce()
//์ต์
์ ์ธ
export default {
inheritAttrs : false,
customOptions: {}
}
</script>
<script setup>
//๊ฐ ์ธ์คํด์ค ์์ฑ์ setup() ๋ฒ์์์ ์คํ
</script>
<script setup>
๋ด์ Top-level์์await
์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ๋๋async setup()
์ด๋ ๊ฒ ์ปดํ์ผ ๋๋ค.
<script setup>
const post = await fetch(`/api/post/1`).then((r) => r.json())
</script>