# ์ปดํฌ์ง์ API Vue 2Vue 3
์ปดํฌ์ง์ (Composition API)์ ์ปดํฌ๋ํธ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ๋์ฌ์ฃผ๋ API์ ๋๋ค. Vue 2์์ ํ๋ฌ๊ทธ์ธ ํํ๋ก ์ง์ (opens new window)๋๋ค๊ฐ Vue 3๋ถํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ณต์ API๋ก ์ฑํ๋์์ต๋๋ค. ๋ฐ๋ผ์, ์๋ ๊ฐ๋ ์ Vue 2์ Vue 3์์ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค ๐
TIP
์ฌ๊ธฐ์ ๋งํ๋ ํ๋ฌ๊ทธ์ธ์ด๋ ๋ทฐ ํ๋ฌ๊ทธ์ธ (opens new window)์ ์๋ฏธํฉ๋๋ค.
# ์ปดํฌ์ง์ API ๊ธฐ์ด
์ปดํฌ์ง์ ์ ์ดํดํ๊ธฐ ์ํด์ ์๋ ๊ฐ๋จํ ์ฝ๋๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
<template>
<div>
<p>{{ message }}</p>
<button @click="changeMessage">change</button>
</div>
</template>
<script>
export default {
data() {
return {
message: 'Hi'
}
},
methods: {
changeMessage() {
this.message = 'Hello'
}
}
}
</script>
์ ์ฝ๋๋ message
๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ธํ๊ณ changeMessage
๋ผ๋ ๋ฉ์๋๋ก ๋ฉ์์ง ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฐ๋จํ ์ฝ๋์
๋๋ค. ์ด ์ฝ๋๋ฅผ ์ปดํฌ์ง์
์ผ๋ก ๋ฐ๊ฟ๋ณด๊ฒ ์ต๋๋ค.
<template>
<div>
<p>{{ message }}</p>
<button @click="changeMessage">change</button>
</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('Hello');
const changeMessage = () => {
message.value = 'Hi';
}
return { message, changeMessage }
}
}
</script>
์ด ์ฝ๋๋ ๋ทฐ ์ธ์คํด์ค ์ต์
์์ฑ์ผ๋ก setup
์ด๋ผ๋ ์์ฑ์ ์ ์ธํ๊ณ ๊ทธ ์์ message
์ changeMessage
๋ผ๋ ๋ฐ์ดํฐ์ ๋ฉ์๋ ํจ์๋ฅผ ์ ์ธํ ์ฝ๋์
๋๋ค. ์ปดํฌ์ง์
์ ์ด์ฒ๋ผ setup
์ด๋ผ๋ API ์์ ๋ฐ์์ฑ(Vue Reactivity)์ ์ฃผ์
ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ธํ๊ณ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ ์ดํ๋ ํํ๋ก ์์ฑํฉ๋๋ค. ์ ์ฝ๋๋ฅผ ์คํํ ๊ฒฐ๊ณผ๋ ๊ฐ์ต๋๋ค. ๊ทธ๋ผ ํ๋์ฉ ๊ตฌ์ฒด์ ์ผ๋ก ์ดํด๋ณผ๊น์?
# setup
setup
์ ์ปดํฌ์ง์
์คํ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด ๊ผญ ์ ์ธํด ์ฃผ์ด์ผ ํ๋ ์ต์
์
๋๋ค. ์ปดํฌ๋ํธ ์ต์
์์ฑ์ด๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ์ฑ๊ธ ํ์ผ ์ปดํฌ๋ํธ๋ ๋ทฐ ์ธ์คํด์ค ์์ ๋ฐ๋ก ์ ์ธํ ์ ์์ต๋๋ค.
// ๋ทฐ ์ธ์คํด์ค
Vue.createApp({
setup() {
// ...
}
});
<!-- ์ฑ๊ธํ์ผ ์ปดํฌ๋ํธ -->
<script>
export default {
setup() {
// ...
}
}
</script>
# ref ์๊ฐ
ref
๋ ๋ทฐ์ ๋ฐ์์ฑ์ ์ฃผ์
ํ๋ API์
๋๋ค. ๊ธฐ์กด์ data
์์ฑ์ ์ ์ธํ๋ ๊ฐ๋ค์ ๋ชจ๋ ๋ทฐ ์ธ์คํด์ค ๋ผ์ดํ์ฌ์ดํด ๊ณผ์ ์์ ๋ฐ์์ฑ์ด ์ฃผ์
๋์์ต๋๋ค. ์ด ๋ฐ์์ฑ ์ฃผ์
์ ์ข ๋ ๋ช
์์ ์ธ API๋ก ๋ฐ๊พผ ๊ฒ์ด์ฃ .
์๋ ๋ ์ฝ๋๋ ๊ฐ์ ์ญํ ์ ํฉ๋๋ค.
// ๋ทฐ ์ธ์คํด์ค ์ต์
์คํ์ผ
Vue.createApp({
data() {
return {
message: ''
}
}
});
// ๋ทฐ ์ปดํฌ์ง์
์คํ์ผ
import { ref } from 'vue';
createApp({
setup() {
const message = ref('');
return { message }
}
});
๋ทฐ ์ธ์คํด์ค ์ต์
์์ฑ์ผ๋ก ์ ๊ณต๋๋ data
๋ฅผ ์ธ๊ฑฐ๋ ๊ทธ๋ ์ง ์๊ณ ๋ณ๋์ ref
๋ผ๋ API๋ฅผ ์ํฌํธํด์ setup
์์์ ์ฌ์ฉํ ๊ฑฐ๋์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
# ref ์ฒซ ๋ฒ์งธ ํน์ง - setup ํจ์์์ ๊ผญ ๋ฐํํ๊ธฐ
setup
์์์ ref
๋ก ์ ์ธ๋ ๊ฐ์ ํญ์ ๋ฐํํด ์ค์ผ ํ
ํ๋ฆฟ ํํ์ ๋๋ ๊ฐ์ ์ธ์คํด์ค(์ปดํฌ๋ํธ) ๋ด์ ๋ค๋ฅธ ๋ก์ง์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
import { ref } from 'vue';
createApp({
setup() {
const message = ref('');
return { message }
},
methods: {
changeMessage() {
this.message = 'Hello Compositon';
}
}
});
๋ง์ฝ ์๋์ ๊ฐ์ด setup
ํจ์์์ ref
๋ก ์ ์ธ๋ ๊ฐ์ ๋ฐํํ์ง ์๋๋ค๋ฉด ์ปดํฌ๋ํธ์์ ์ธ์ํ์ง ๋ชปํด ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ๋๋ค.
import { ref } from 'vue';
createApp({
setup() {
const message = ref('');
},
methods: {
changeMessage() {
this.message = 'Hello Compositon'; // `message`๊ฐ ์ ์ธ๋์ง ์์ ๊ฒ์ผ๋ก ๊ฐ์ฃผ
}
}
});
# ref ๋ ๋ฒ์งธ ํน์ง - .value
ref
๋ก ์ ์ธ๋ ๊ฐ์ setup ํจ์ ์์์ ๋ค๋ฃฐ ๋๋ .value
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์๋ ์์ ์ฝ๋๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
<script>
export default {
setup() {
// data
const message = ref('hi');
// methods
const changeMessage = () => {
message.value = 'Hello';
};
return { message, changeMessage }
}
}
</script>
์ ์ฝ๋๋ message
๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ธํ๊ณ changeMessage
๋ผ๋ ๋ฉ์๋ ํจ์๋ก message
๋ฐ์ดํฐ์ ๊ฐ์ Hello
๋ก ๋ฐ๊พธ๋ ์ฝ๋์
๋๋ค. ์ฌ๊ธฐ์ changeMessage
ํจ์๋ฅผ ๋ณด๋ฉด message
๊ฐ์ ๋ฐ๋ก ๋ฐ๊พธ๋ ๊ฒ์ด ์๋๋ผ .value
๋ผ๋ ๊ฐ์ ์ ๊ทผํ์ฌ ๋ณ๊ฒฝํ์์ต๋๋ค.
์ด์ฒ๋ผ setup
ํจ์ ๋ด์์ ref
๋ก ์ ์ธ๋ ๊ฐ์ ์ฝ๊ฑฐ๋ ๋ณ๊ฒฝํ ๋๋ .value
๊ฐ์ ๋ค๋ค์ผ ํฉ๋๋ค. ์ ์ฝ๋์ setup
ํจ์์์ ๋ฐํ๋ message
๋ ํ
ํ๋ฆฟ ํํ์์์ ์๋์ ๊ฐ์ด ์ ๊ทผํ ์ ์์ต๋๋ค.
<template>
<p>{{ message }}</p>
</template>
์ setup
ํจ์ ์์์๋ .value
๋ก ๋ฉ์์ง ๊ฐ์ ์ ๊ทผํ๋๋ฐ ํ
ํ๋ฆฟ ํํ์์์๋ message
๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ์๊น์? ๊ทธ ์ด์ ๋ ๋ฐ๋ก ๋ทฐ ๋ด๋ถ์ ์ผ๋ก message
์์ ์๋ value
๊ฐ์ ๊บผ๋ด์ด ํ
ํ๋ฆฟ ํํ์์ ์ฐ๊ฒฐํด ์ฃผ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ฌํ ๋์์ ๊ธฐ์กด์ Vue 2์์ ๊ฐ๋ฐํ๋ ๊ฒฝํ์ ํฌ๊ฒ ํด์น์ง ์๊ธฐ ์ํด ๊ณ ์๋ ์ฅ์น๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
# ์ฐธ๊ณ ์๋ฃ
์ปดํฌ์ง์ ์ ๋ํด ๋ ์์ธํ ์์๋ณด๊ณ ์ถ๋ค๋ฉด ๋ค์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
โ Form Handling Slots โ