[Vue.js] λΌμ΄νμ¬μ΄ν΄ ν (Lifecycle Hooks)
ν¬μ€ν μ΄μ μ μμ
π‘ Vue.jsμ λΌμ΄νμ¬μ΄ν΄(Lifecycle)μ΄λ?
Vue μ»΄ν¬λνΈλ λ¨μν ν λ² λ§λ€μ΄μ§κ³ λλλ κ² μλλΌ, νμλΆν° μλ©ΈκΉμ§ μΌλ ¨μ λ¨κ³λ₯Ό κ±°μΉ©λλ€.
μ΄ κ³Όμ μ μ»΄ν¬λνΈ μλͺ μ£ΌκΈ°(Lifecycle)λΌκ³ λΆλ¦ λλ€.
μ½κ² λ§νλ©΄, μ»΄ν¬λνΈκ°
μμ±λκ³ (create), DOMμ λΆκ³ (mount), μ λ°μ΄νΈλκ³ (update), μ¬λΌμ§κΈ°κΉμ§ (unmount)
μ΄ μ 체 νλ¦μ Vueκ° λ΄λΆμ μΌλ‘ κ΄λ¦¬νκ³ μμΌλ©°, κ°μ₯ μ€μν μμλ
νΉμ μμ λ§λ€ μ€νν μ½λλ₯Ό μ§μ μμ±ν μ μλ€λ κ²μ λλ€.
μ΄λ μ¬μ©νλ κ² λ°λ‘! λΌμ΄νμ¬μ΄ν΄ ν (Lifecycle Hooks) μ λλ€.
Vue 3μμλ μ»΄ν¬λνΈμ μλͺ μ£ΌκΈ° λμ νΉμ μμ μ μ€νν μ μλ λΌμ΄νμ¬μ΄ν΄ ν (Lifecycle Hooks)μ μ 곡ν©λλ€.
μμ Vue 2μμλ created, mounted, destroyed κ°μ μ΅μ μ μ¬μ©νμ§λ§,
Vue 3μ <script setup> λ¬Έλ²μμλ μ‘°κΈ λ€λ₯΄κ² μ¬μ©ν©λλ€.
μ΄λ² κΈμμλ μμ£Ό μ°μ΄λ ν λ€κ³Ό, μ€μ νλ‘μ νΈμμ μ΄λ»κ² νμ©νλμ§ κ°λ¨ν μμ μ ν¨κ» μ 리ν΄λ³΄μμ΅λλ€.
1. κΈ°λ³Έ μ¬μ©λ²
<script setup>μ μ¬μ©ν λλ λΌμ΄νμ¬μ΄ν΄ ν μ onMounted, onUnmounted, onUpdated λ±μ ν¨μλ‘ λΆλ¬μμ μ¬μ©νλ©°,
Vueμμ μ 곡νλ vue λͺ¨λμμ importν΄μΌ ν©λλ€.
<template>
<div>λΌμ΄νμΈμ΄ν΄ μμ </div>
</template>
<script setup>
import { onMounted } from 'vue'
onMounted(() => {
console.log('## onMounted')
})
</script>
π¨π» μ€νκ²°κ³Ό
μμ κ°μ΄ μ»΄ν¬λνΈκ° DOMμ μμ ν λ§μ΄νΈ λ λ νΈμΆλλ κ²μ νμΈν μ μμ΅λλ€.
2. μ£Όμ λΌμ΄νμ¬μ΄ν΄ ν μ 리
μμμλ onMountedμ λν΄μλ§ ν μ€νΈλ₯Ό ν΄λ³΄μμ§λ§, μ€μ λ‘λ μμ£Ό μ¬μ©νλ λΌμ΄νμ¬μ΄ν΄ ν μ΄ λ μ‘΄μ¬ν©λλ€.
- onBeforeMount
- μ»΄ν¬λνΈκ° DOMμ λΆκΈ° μ μ νΈμΆλ©λλ€. - onMounted
- μ»΄ν¬λνΈκ° DOMμ μμ ν λ§μ΄νΈλ ν νΈμΆλ©λλ€. DOM μ‘°μμ΄λ μΈλΆ λΌμ΄λΈλ¬λ¦¬ μ°λμ μμ£Ό μ¬μ©λ©λλ€. - onBeforeUpdate
- λ°μν μνκ° λ³κ²½λμ΄ DOMμ΄ μ λ°μ΄νΈλκΈ° μ§μ μ νΈμΆλ©λλ€. - onUpdated
- λ°μν μν λ³κ²½μΌλ‘ μΈν΄ DOMμ΄ μ λ°μ΄νΈλ μ§νμ νΈμΆλ©λλ€. - onBeforeUnmount
- μ»΄ν¬λνΈκ° DOMμμ μ κ±°λκΈ° μ§μ μ νΈμΆλ©λλ€. - onUnmounted
- μ»΄ν¬λνΈκ° μμ ν μΈλ§μ΄νΈλ ν νΈμΆλ©λλ€. μ΄λ²€νΈ 리μ€λ ν΄μ κ°μ μ 리μ μ ν©ν©λλ€.
App.vue
<template>
<div>
<button @click="showTest = !showTest">
{{ showTest ? 'μ»΄ν¬λνΈ μ κ±°' : 'μ»΄ν¬λνΈ λ€μ 보μ¬μ£ΌκΈ°' }}
</button>
<Body v-if="showTest" />
</div>
</template>
<script setup>
import { ref } from 'vue'
import Body from '../components/Body.vue'
const showTest = ref(true)
</script>
Body.vue
<template>
<div>
<h2>λΌμ΄νμ¬μ΄ν΄ ν
μ€νΈ</h2>
<p>μΉ΄μ΄νΈ: {{ count }}</p>
<button @click="count++">μΉ΄μ΄νΈ μ¦κ°</button>
</div>
</template>
<script setup>
import {
ref,
onBeforeMount,
onMounted,
onBeforeUpdate,
onUpdated,
onBeforeUnmount,
onUnmounted
} from 'vue'
const count = ref(0)
// π΅ μ»΄ν¬λνΈκ° μμ§ DOMμ λΆκΈ° μ , setup() λ€μ λ¨κ³μμ νΈμΆλ¨
onBeforeMount(() => {
console.log('π΅ onBeforeMount: DOMμ λΆκΈ° μ§μ ')
})
// π’ μ»΄ν¬λνΈκ° DOMμ μμ ν λ§μ΄νΈλ ν νΈμΆλ¨
// μ΄ μμ μ μ€μ HTML μμμ μ κ·Όκ°λ₯
onMounted(() => {
console.log('π’ onMounted: DOM λ§μ΄νΈ μλ£')
})
// π‘ λ°μν μν(count λ±)κ° λ³κ²½λμ΄ DOMμ΄ λ°λκΈ° *λ°λ‘ μ *μ νΈμΆλ¨
// DOMμ΄ λ°λκΈ° μ§μ μ μνλ₯Ό νμΈνκ±°λ, λ³κ²½ μ§μ μ²λ¦¬ν μΌμ΄ μλ€λ©΄ μ¬κΈ°μμ μ²λ¦¬
onBeforeUpdate(() => {
console.log('π‘ onBeforeUpdate: DOM μ
λ°μ΄νΈ μ§μ ')
})
// π λ°μν μνκ° λ°λκ³ μ€μ DOMκΉμ§ λ°λ νμ νΈμΆλ¨
// λ³κ²½λ DOMμ νμΈνκ±°λ νμ²λ¦¬ν λ μ¬μ©λ¨
onUpdated(() => {
console.log('π onUpdated: DOM μ
λ°μ΄νΈ μλ£')
})
// π΄ μ»΄ν¬λνΈκ° DOMμμ μ κ±°λκΈ° μ§μ νΈμΆλ¨
// μ κ±° μ μ 리μμ€λ₯Ό μ 리νκ±°λ μ¬μ©μ νμΈ λͺ¨λ¬ λ±μ λμΈ μλ μμ
onBeforeUnmount(() => {
console.log('π΄ onBeforeUnmount: DOM μ κ±° μ§μ ')
})
// β« μ»΄ν¬λνΈκ° μμ ν μ κ±°λ ν νΈμΆλ¨
// μ΄λ²€νΈ 리μ€λ ν΄μ , νμ΄λ¨Έ μ κ±° λ± λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νλ μ 리 μμ
μ μ ν©
onUnmounted(() => {
console.log('β« onUnmounted: DOM μ κ±° μλ£')
})
</script>
π¨π» μ€νκ²°κ³Ό
β 1. νλ©΄μ΄ λ λλ§(mount) λμμ λ
μ»΄ν¬λνΈκ° μ²μ μκΈΈ λ νΈμΆλ©λλ€.
onBeforeMount, onMounted
β 2. λ°μν μν λ±μ΄ λ³κ²½λμ΄ νλ©΄μ΄ μ λ°μ΄νΈλ λ
μΉ΄μ΄νΈ ν΄λ¦ μ ref κ°(count)μ μ¦κ°μν¬ λ μνκ° λ³κ²½μ΄ λλ©΄μ νΈμΆλ©λλ€.
onBeforeUpdate, onUpdated
β 3. μ»΄ν¬λνΈκ° μ κ±°(unmount) λ λ
λΆλͺ¨ μ»΄ν¬λνΈμμ v-ifλ‘ ν΄λΉ μ»΄ν¬λνΈλ₯Ό μ κ±°ν λ νΈμΆλ©λλ€.
onBeforeUnmount, onUnmounted
μ΄ μΈμλ μλμ κ°μ λΌμ΄νμ¬μ΄ν΄λ μμΌλ μ°Έκ³ ν΄μ£ΌμΈμ !
- onActivated
- <keep-alive>λ‘ κ°μΌ μ»΄ν¬λνΈκ° νμ±νλ λ νΈμΆλ©λλ€. - onDeactivated
- <keep-alive>λ‘ κ°μΌ μ»΄ν¬λνΈκ° λΉνμ±νλ λ νΈμΆλ©λλ€. - onErrorCaptured
- νμ μ»΄ν¬λνΈμμ μ€λ₯κ° λ°μνμ λ νΈμΆλ©λλ€. - onRenderTracked
- λ°μν λ λλ§ μ μ΄λ€ κ°μ΄ μΆμ λλμ§ λλ²κΉ μ©μΌλ‘ νμΈν μ μμ΅λλ€. - onRenderTriggered
- μ΄λ€ λ°μν κ°μ΄ λ³κ²½λμ΄ λ λλ§μ΄ νΈλ¦¬κ±°λμλμ§ μΆμ ν μ μμ΅λλ€.
3. Piniaλ₯Ό μ¬μ©ν μμ
Piniaλ‘ κ΄λ¦¬νλ μ€ν μ΄μ μν λ³νλ₯Ό κ°μ§νκ³ , μ»΄ν¬λνΈκ° λ§μ΄νΈλ λ μ΄κΈ° λ°μ΄ν°λ₯Ό λΆλ¬μ€λ ꡬ쑰λ₯Ό μκ°ν΄λ³Ό μ μμ΅λλ€.
<script setup>
import { onMounted } from 'vue'
import { useUserStore } from '@/stores/user'
const userStore = useUserStore()
onMounted(async () => {
await userStore.fetchUserData()
console.log('μ¬μ©μ μ 보 λΆλ¬μ€κΈ° μλ£!')
})
</script>
onMounted μμμ λΉλκΈ°λ‘ λ°μ΄ν°λ₯Ό λΆλ¬μ€λ©΄, μ»΄ν¬λνΈκ° νλ©΄μ λνλ λ μ¬μ©μ μ 보λ₯Ό μ΄κΈ°νν μ μμ΅λλ€.
Vue 3μ λΌμ΄νμ¬μ΄ν΄ ν μ μκ°λ³΄λ€ κ°λ¨νκ³ μ§κ΄μ μ λλ€.
κ°μΈμ μΌλ‘λ onMountedμμ μ΄κΈ° λ°μ΄ν°λ₯Ό λΆλ¬μ€λ ν¨ν΄μ μ©μ΄νκ² μμ£Ό μ°κ³ μμ΅λλ€. π