ํ์
์คํฌ๋ฆฝํธ ์คํ๋ ๋ฐ ์ฃผ๋ง์๋ ๊ฑด๊ฐ ์ด์ ๋ฐ ๊ฐ์ธ ์ผ์ ์ผ๋ก TIL๋ฅผ ๋ฏธ์ฒ ์ ๋ฆฌํ์ง ๋ชปํ๋ค.
๋ณธ๊ฒฉ์ ์ผ๋ก Vue ํ๋ก์ ํธ ์ค์ต ๊ฐ์ ์ ๋ด์ฉ๋ค์ด๋ผ ๋ค์ ์ด๋ ค์ด ๋ด์ฉ๋ค์ด ๋ง์๋ค.
๊ทธ ์ค ๊ผญ ๊ธฐ์ตํด๋๊ณ ํ๋ก์ ํธ ๋๋ ์์ฃผ ์ฐ์ผ ๊ฒ ๊ฐ์ ๊ธฐ๋ฅ์ด๋ ์ฃผ์์ฌํญ๋ค์ ์์ฝํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ๋๊ฒจ์ค props๋ ์์ ์ปดํฌ๋ํธ์์ ์์ ์ด ๋ถ๊ฐ๋ฅํ๋ค.
์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ์ํด v-model
๋๋ ํฐ๋ธ๊ฐ ์กด์ฌํ์ง๋ง ์ด๊ฒ์ props์๋ ๊ทธ๋ฅ ์ฉ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋๋ฉด props ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ ์์น ๋๋ฌธ์ ์ ์ฉ๋์ง ์๋๋ค.
๋ฐ๋ผ์ ๋ช ๊ฐ์ง ์ถ๊ฐ ์ฝ๋ ์ค์ ์ด ํ์ํ๋ค.
// App.vue ๋ถ๋ชจ ์ปดํฌ๋ํธ
<template>
<h1>
{{ msg }}
</h1>
<Hello
v-model:message="msg"
/>
</template>
<script>
import Hello from '~/components/Hello'
export default {
components: {
Hello,
},
data() {
return {
msg: 'Hello Vue!',
}
}
}
</script>
๋จผ์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ธ App.vue
์์๋ msg
๋ผ๋ ๋ฐ์ดํฐ๋ฅผ props๋ฅผ ๋๊ฒจ์ค์ผ ํ๋ค.
Hello
์ปดํฌ๋ํธ์ props๋ก ๋๊ฒจ์ค ๋ v-model
๋ก ๋๊ฒจ์ฃผ๊ฒ ๋๋๋ฐ ์ด ๋ ์์ ๋๊ฒจ์ค props์ ์ด๋ฆ message
์ :
๊ณผ ํจ๊ป ๊ฐ์ด ์ถ๊ฐํ์ฌ ๋๊ฒจ์ค๋ค.
์ด๊ฒ์ ์ง์ ํ์ง ์๊ณ ๋๊ฒจ์ฃผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก๋ props ์์ฑ์์ modelValue
๋ผ๋ ์ด๋ฆ์ผ๋ก ๋์ด๊ฐ๊ฒ ๋๋ค.
// Hello.vue
<template>
<label>
<input
:value="message"
@input="$emit('update:message', $event.target.value)" />
</label>
</template>
<script>
export default {
props: {
message: {
type: String,
default: ''
}
}
}</script>
//...
์ด๋ ๊ฒ ๋๊ฒจ๋ฐ์ props๋ฅผ ์์ ์ปดํฌ๋ํธ Hello.vue
์์ message
๋ผ๋ ์์ฑ์ผ๋ก props
์์ฑ์ผ๋ก ์ถ๊ฐํด์ค๋ค.
์ดํ input
ํ๊ทธ์์ ํ์ํ :value
๋ก ๋ฐ์ธ๋ฉํด์ฃผ๊ณ @input
์ด๋ฒคํธ์๋ $emit
์ ์ฌ์ฉํด์ ์ปค์คํ
์ด๋ฒคํธ๋ฅผ ์ง์ ํ๋ค.
์ด ๋ ์ปค์คํ
์ด๋ฒคํธ๋ช
์ผ๋ก update:message
์ฒ๋ผ ์ด๋ค props๋ฅผ ์์ ํ๋ ๊ฒ์ธ์ง ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋๊ฒจ์ฃผ์ด์ผ ํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ props๋ฅผ ์์ ์ปดํฌ๋ํธ์์ ์์ ํ ์๋ ์์ผ๋ ์์ ํ ๋์์ ์ด๋ฒคํธ๋ช
๊ณผ ํจ๊ป ์๋ ค์ฃผ๊ณ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ๊ทธ๊ฒ์ ๋ฐ์ ์์ ํ๋ ๊ฐ๋
์ด๋ค. (์๋ง ์ด๊ฑฐ ํด์ค~)
์ด๋ ๊ฒ ํด์ผ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ ์ญ์ ์ผ๋ก ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๊ณ ์๊ธฐ์น ์์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ผ๋ก ์ธํ ์ค๋ฅ๋ฅผ ๋ง์ ์ ์๋ค.
v-show
๋๋ ํฐ๋ธ์ฒ๋ผ ์ ํ ํจ๊ณผ๊ฐ ๋ง์ด ์์๋๋ ๋์ ์ปดํฌ๋ํธ์ ์ง์ ํ ์ ์๋ keep-alive
ํ๊ทธ๊ฐ ์๋ค.
๊ธฐ๋ณธ์ ์ธ ๋์ ์ปดํฌ๋ํธsms :is
์์ฑ์ ํตํด ํด๋น ์ปดํฌ๋ํธ๋ช
์ด ์ผ์นํ ๊ฒฝ์ฐ Hello
์ World
์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง์ ํ ์ ์๋ค.
//...
<button @click="currentComponent = 'Hello'">
Hello!
</button>
<button @click="currentComponent = 'World'">
World!
</button>
<component :is="currentComponent" />
//...
ํ์ง๋ง ์ด๋ ๊ฒ ๋ฒํผ์ ๋๋ฅผ ๋๋ง๋ค created
์ unmounted
์๋ช
์ฃผ๊ธฐ๋ฅผ ์ฝ์๋ก ํ์ธํด๋ณด๋ฉด ํด๋น ์ปดํฌ๋ํธ๊ฐ ๋ฐ๋ ๋๋ง๋ค ์์ฑํ๊ณ unmount๋ฅผ ๋ฐ๋ณตํ๋ ๊ฒ์ ์ ์ ์๋ค.
๋ฐ๋ผ์ ๋ถํ์ํ ๋ ๋๋ง์ด ๋ฐ๋ณต๋ ์ ์๊ธฐ์ ์ด๋ฅผ ๋ฐฉ์งํ ์ ์๋ ๋ฐฉ๋ฒ์ด keep-alive
ํ๊ทธ์ด๋ค.
//..
<keep-alive>
<component :is="currentComponent" />
</keep-alive>
์์ ๊ฐ์ด ๋์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๊ฒ ๋๋ฉด ํด๋น ๋์ ์ปดํฌ๋ํธ๋ ์ด๋ฏธ created
์ํ์์ ์ปดํฌ๋ํธ๋ช
์ ๋ง๊ฒ ๋ณํํ๋ค.
๋ฌด์กฐ๊ฑด keep-alive
ํ๊ทธ๊ฐ ์ข์ ๊ฒ์ ์๋๋ค.
์ ํ ํจ๊ณผ๊ฐ ๋ง์ด ํ์์๋๋ฐ๋ ์ด๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ก์๋จน๊ฒ ๋๋ฏ๋ก ํญ์ ์ํฉ์ ๋ง๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํ๋ค.
App.vue
์์ ๋ค์ํ ์์ ์ปดํฌ๋ํธ๋ค์ ์ฌ์ฉํ๊ฒ ๋๋ฉด import ๊ตฌ๋ฌธ์ด ์์ฒญ ๋ง์์ง๊ฒ ๋๋ค.
// App.vue
<script>
import TextField from '~/components/fields/TextField'
import SimpleRadio from '~/components/fields/SimpleRadio'
// ๋ ๋ง์์ง ์๋ ์๋ค...
export default {
components: {
TextField,
SimpleRadio
// ๋ ์ถ๊ฐ ๊ฐ๋ฅ...
},
// ...
}
</script>
์ด๋ด ๋ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ๋์ js ํ์ผ๋ก ๋ฌถ์ด์ import ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋จผ์ index.js
๋ผ๋ ํ์ผ๋ก export ๊ตฌ๋ฌธ์ ๊ทธ๋ฃนํํ๋ค.
์ด๋ default as
๊ตฌ๋ฌธ์ผ๋ก export ํ๋ ์ปดํฌ๋ํธ๋ช
์ ์ง์ ํ๋ค.
// index.js
export { default as TextField } from './TextField'
export { default as SimpleRadio } from './SimpleRadio'
๋ค์ App.vue
์์ ๋ค์๊ณผ ๊ฐ์ด importํ๋ฉด ์ฝ๋๊ฐ ํ์ธต ๊น๋ํ๊ฒ ํ๊บผ๋ฒ์ import๊ฐ ๊ฐ๋ฅํ๋ค.
// App.vue
<script>
import * as FieldComponents from '~/components/fields/index.js'
export default {
components: {
...FieldComponents
},
// ...
}
</script>
ํ๋ก์ ํธ์ ํฌ๊ธฐ๊ฐ ์ปค์ง์๋ก ์ปดํฌ๋ํธ์ ๊ฐฏ์๋ฅผ ๋น๋กํด์ ๋ง์์ง๋ฏ๋ก ๋ฐ๋์ ์์ ๊ฐ์ด import ํด์ฃผ๋ ๊ฒ์ด ํ์ํ ๊ฒ ๊ฐ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ปดํฌ๋ํธ์ ํ
ํ๋ฆฟ์ ์์ฑํ ์์น์ ๋ง๊ฒ ์๋ ๊ทธ๋๋ก DOM์ ๋ ๋๋ง๋๋ค.
ํ์ง๋ง CSS์ ๋ํ ์ด์๋ก ์ธํด ํน์ ์ปดํฌ๋ํธ์ ์์น๋ฅผ ๋
ผ๋ฆฌ์ ์ธ ๊ตฌํ ์์น๊ฐ ์๋ ๊ณณ์ ๋ฐฐ์นํ๊ณ ์ถ์ ๋๊ฐ ์๋ค.
๊ฐ์์์๋ position: fixed
๋ฅผ ๊ฐ์ง ํ์ div
์์๊ฐ body
ํ๊ทธ๊ฐ ์๋ transform
์์ฑ์ ๊ฐ์ง ๋ถ๋ชจ ํ๊ทธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ณ ์ ๋๋ ๊ฒ์ ์์๋ก ๋ค์๋ค.
์ด์ ๊ฐ์ด ๋ด๊ฐ ์ํ๋ body
ํ๊ทธ์ ํน์ ์ปดํฌ๋ํธ๋ฅผ ์์น(์ด๋)์ํค๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
๋ฐ๋ก teleport
ํ๊ทธ์ด๋ค.
// Modal.vue
<teleport to="body">
<template v-if="modelValue">
<div
class="modal"
@click="offModal">
<div>
<!-- ... -->
</div>
</div>
</template>
</teleport>
๋ค์๊ณผ ๊ฐ์ด ์ด๋์ํค๊ณ ์ถ์ ์์๋ค์ template
ํ๊ทธ๋ก ๋ฌถ์ ๋ค ํด๋น template
ํ๊ทธ๋ฅผ ๋ค์ teleport
ํ๊ทธ๋ก ๊ฐ์ผ๋ค.
๊ทธ๋ฆฌ๊ณ to="css์ ํ์"
์์ฑ์ ์ถ๊ฐํด์ CSS ์ ํ์๋ก ํด๋น ์์๋ค์ด ๋ด๋ถ์ ๋ค์ด๊ฐ ๋ถ๋ชจ DOM ์์๋ฅผ ์ง์ ํด์ฃผ๋ฉด ๋๋ค.
teleport
ํ๊ทธ ์์ ์๋ v-bind
๋ฐ์ดํฐ๋ @
ํด๋ฆญ ์ด๋ฒคํธ ๋ฑ์ ๋ชจ๋ ์ ์ง๋๊ธฐ ๋๋ฌธ์ DOM ๊ธฐ์ค์ผ๋ก ์์น๋ง ์ด๋์ํค๊ณ ์ถ์ ๋ ์์ฃผ ์ ์ฉํ๋ค.
์์๋ก ๋ ๋ชจ๋ฌ๊ณผ ๊ฐ์ด ๋ ์ด์์ ์ธก๋ฉด์์ ํน์ํ๊ฒ ์์นํด์ผ ํ๋ ์์๋ค์ ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
๋ณดํต์ ์ด๋ฒคํธ๋ฅผ ์ง์ ํ ๋ addEventListener
๋ก ์ด๋ฒคํธ๋ฅผ ๋ถ์ฌ๋ ๋ง์ด ํด๋ดค๋ค.
ํ์ง๋ง ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ์๋ removeEventListener
๋ก ํด๋น ์์์ ๋ํ ๋ถ์ฌ๋ ์ด๋ฒคํธ๋ฅผ ์ ๊ฑฐ๋ ํด์ฃผ์ด์ผ ํ๋ค.
// Modal.Vue ๋ด ๋ชจ๋ฌ์ esc๋ก ๋ซ๋ ์ด๋ฒคํธ ํธ๋ค๋ง watch ์์ฑ
watch: {
modelValue(newValue) {
if (newValue) {
window.addEventListener('keyup', this.keyupHandler)
} else {
window.removeEventListener('keyup', this.keyupHandler)
}
}
},
์์ ์ฝ๋์ฒ๋ผ modelValue
๋ก๋ App.vue
์์ ์ปดํฌ๋ํธ์ ๋๊ฒจ์ค isShow
๋ฐ์ดํฐ๊ฐ ๋ค์ด์จ๋ค.
isShow
๊ฐ true
์ด๋ฉด ๋ชจ๋ฌ์ด ๋ณด์ฌ์ง ์ํ์ด๋ฏ๋ก escํค๊ฐ ๋๋ฅด๋ keyup
์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํด์ ํด๋น key๋ก ๋ชจ๋ฌ์ ๋ซ์ ์ ์๊ฒ ํ๋ค.
ํ์ง๋ง ๋ฐ๋์ ๊ฒฝ์ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๋ชจ๋ฌ์ ๋ ์์ง ์๋ ์ํ์ธ๋ฐ๋ ์ด๋ฒคํธ๊ฐ ์ ์ง๋์ด ์์ผ๋ฉด esc๋ฅผ ๋๋ฅผ ๋ ์ด๋ฒคํธ์ ๋ํ ์์ฌ ๋์์ด ๊ณ์ํด์ ๋ฐ์ํ๊ฒ ๋๋ค.
(ex. ์ฝ์๋ก 'esc ๋๋ฆ' ์ถ๋ ฅ)
๋ฐ๋ผ์ ๋ชจ๋ฌ์ด ๋ ์์ง ์์ ๋๋ ์ ์ฒด window์ ๋ํ ์ด๋ฒคํธ๋ฅผ ์ ๊ฑฐํด์ฃผ์ด์ผ ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ฌ์ ํจ์จ์ ์ด๋ค.
์ด๋ฒคํธ๋ฅผ ๋ถ์ฌํ๋ ๊ฒ์๋ง ์ง์คํ์ง ๋ง๊ณ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ถํ์ํ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์ ์ฉ๋์ด ์์ง๋ ์๋์ง ์ต์ ํ๋ฅผ ๋ฐ๋์ ํด์ฃผ์ด์ผ ํ๋ค.
Vue๋ก ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋ํด์ ์ด๋ ต์ง๋ง ์ค์ํ ๋ด์ฉ๋ค์ ๋ฝ์ ์์ฝํ๋ ์ข ๋ ๋จธ๋ฆฌ์ ์ ๋ค์ด์ค๋ ๊ฒ ๊ฐ๋ค.
Vue ๊ณผ์ ๊ฐ ๋ฒ์จ ๋์ค๋ค๋... API๋ฅผ ํตํด ํ๋ก์ ํธ๋ฅผ ๋ง๋๋ ๊ฒ์ธ๋ฐ ๋ฐฐ์ธ ๋ด์ฉ๋ ์ ์ฉํด๋ณผ ๋ด์ฉ๋ ๋๋ฌด๋ ๋ง๋ค..
Vue๋ฅผ ๊ณต๋ถํ๋ฉด์ Vue ๊ณต์๋ฌธ์์์ ํด๋น ๊ฐ๋
์ด๋ ๊ธฐ๋ฅ๋ค์ ์ ๋
ํด๋ณด๋ ์ข ๋ ๊ธฐ์ด๊ฐ ํํํ๊ฒ ์ง์ฌ์ง๋ ๊ฒ ๊ฐ๋ค. ๋๊ตฐ๊ฐ๋ Reactํ์ง ์ Vue ์ ์ธ ๊ฑฐ ๋ฐฐ์ฐ์ง ๋ง์๊ณ ํ๊ฒ ์ง๋ง ๋ ๋ญ๋ ๋์ค์ ๋ค ์ฐ๊ฒฐ์ด ๋ ๊ฑฐ๋ผ ์๊ฐํ๊ณ ๊ฐ๋
์ ๋ค์ ธ๋์ ์๊ฐ์ด๋ค. (๊ทผ๋ฐ ์๊ฐ์ด ๋ ๋ง์ด ๊ฑธ๋ฆฌ๊ธด ํ๋ค... ใ
ใ
ใ
)
๐ ํด๋น ๋ด์ฉ์ ๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ํ๋ฆฐ ๋ถ๋ถ์ด๋ ์คํดํ๊ณ ์๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ํผ๋๋ฐฑ ๋ถํ๋๋ฆฝ๋๋ค.