λ€μμ μΈμ€ν΄μ€ μλͺ μ£ΌκΈ°μ λν λ€μ΄μ΄κ·Έλ¨μ΄λ€. μ§κΈ μ§ν μ€μΈ λͺ¨λ κ²μ μμ ν μ΄ν΄ν νμλ μμ§λ§ λ λ§μ΄ λ°°μ°κ³ ꡬμΆν¨μ λ°λΌ μ μ©ν μ°Έκ³ μλ£κ° λλ€. μμΈν λ΄μ©μ Vue.js μλͺ μ£ΌκΈ° ν μ μ°Έκ³ νμ
Lifecycle Hooksμ ν¬κ² 4λ¨κ³λ‘ λλ μ§λ€.
Creation(μμ±)
>Mounting(μ₯μ°©)
>Updating(μμ )
>Destruction(μλ©Έ)
μ»΄ν¬λνΈ μ΄κΈ°ν λ¨κ³μ΄λ©°
Creation Hooks
μ λΌμ΄νμ¬μ΄ν΄ λ¨κ³μμ κ°μ₯ λ¨Όμ μ€νλλ€.
μ»΄ν¬λνΈ μΈμ€ν΄μ€κ° μ΄κΈ°ν λ λ μ€νλλ€.
data()
λλcomputed
μ κ°μ λ€λ₯Έ μ΅μ μ μ²λ¦¬νκΈ° μ μ μ¦μ νΈμΆλλ€.
μ»΄ν¬λνΈ μΈμ€ν΄μ€κ° μ΄κΈ°νλ₯Ό μλ£ν ν νΈμΆλλ ν μ΄λ€.
Composition APIμ
setup()
ν μ Options API ν λ³΄λ€ λ¨Όμ νΈμΆλλ€.beforeCreate
μcreated
λΌμ΄νμ¬μ΄ν΄ ν μ Options APIμμ μ¬μ©νλ λΌμ΄νμ¬μ΄ν΄ ν μΌλ‘ Vue3 Composition APIλ₯Ό νμ©νμ¬ κ°λ°μ μ§νν λλ setup()ν¨μλ‘ λ체ν μ μμ΅λλ€.
<script>
export default {
beforeCreate(){
},
created(){
},
setup(){
//coding....
}
}
</script>
DOMμ μ»΄ν¬λνΈλ₯Ό μ½μ νλ λ¨κ³μ΄λ€.
onBeforeMount
μonMounted
κ° μλ€.
μ»΄ν¬λνΈκ° λ§μ΄νΈλκΈ° μ§μ μ νΈμΆλλ€.
μ»΄ν¬λνΈκ° λ§μ΄νΈλ νμ νΈμΆλλ€. DOMμ μ κ·Όν μ μλ€.
<template>
<div class="container py-4">
<input ref="inputRef" type="text" value="μλ
νμΈμ. " />
</div>
</template>
<script>
import { onBeforeMount, onMounted, ref } from "vue";
export default {
setup() {
console.log("setup");
const inputRef = ref(null);
//onBeforeMountλ mountλκΈ° μ μ΄λΌ μΆλ ₯X
onBeforeMount(() => {
console.log("onBeforeMount", inputRef.value);
});
//onMountedλ mountλ μ΄νμ΄κΈ° λλ¬Έμ μΆλ ₯
onMounted(() => {
console.log("onMounted", inputRef.value.value);
});
return { inputRef };
},
// beforeCreate() {
// console.log("beforeCreate");
// },
// created() {
// console.log("created");
// },
};
</script>
<style lang="scss" scoped></style>
μΆλ ₯νλ©΄
λΆλͺ¨ μ»΄ν¬λνΈ μλμ μμ μ»΄ν¬λνΈκ° μμκ²½μ° μ΄λ»κ² μ²λ¦¬κ° λλμ§ νμΈν΄λ³΄μ.
λΆλͺ¨ μ»΄ν¬λνΈμ setup
κ³Ό onBeforeMount
κ° λ¨Όμ μ²λ¦¬κ° λ ν μμ μ»΄ν¬λνΈκ° μ²λ¦¬κ° λλ€. μμ μ»΄ν¬λνΈμ μ²λ¦¬κ° λλλ©΄ λΆλͺ¨ μ»΄ν¬λνΈμ onMount
κ° λ§μ§λ§μΌλ‘ μ²λ¦¬λλ€.
μ»΄ν¬λνΈμμ μ¬μ©λλ λ°μν λ°μ΄ν°κ° λ³κ²½λκ±°λ μ΄λ ν μ΄μ λ‘ μ¬λ λλ§μ΄ λ°μλ λ νΈμΆλλ€.
λ°μν μν λ³κ²½μΌλ‘ μΈν΄ μ»΄ν¬λνΈκ° DOM νΈλ¦¬λ₯Ό μ λ°μ΄νΈνκΈ° μ§μ μ νΈμΆλλ€.
μ»΄ν¬λνΈμμ μ¬μ©λλ λ°μν μν κ°μ΄ λ³ν΄μ, DOMμλ κ·Έ λ³νλ₯Ό μ μ©μμΌμΌ ν λκ° μλ€. μ΄ λ, λ³ν μ§μ μ νΈμΆλλ κ²μ΄ λ°λ‘ onBeforeUpdate ν μ΄λ€.
λ°μ μν λ³κ²½μΌλ‘ μΈν΄ μ»΄ν¬λνΈκ° DOM νΈλ¦¬λ₯Ό μ λ°μ΄νΈν νμ νΈμΆλλ€.
μμ μ»΄ν¬λνΈμonUpdated
ν μ νμ μ»΄ν¬λνΈμ ν μ΄νμ νΈμΆλλ€. (Child
>Parent
) μ΄ ν μ λ€λ₯Έ μν λ³κ²½μΌλ‘ μΈν΄ λ°μν μ μλ μ»΄ν¬λνΈμ DOM μ λ°μ΄νΈ νμ νΈμΆλλ€. νΉμ μν λ³κ²½ νμ μ λ°μ΄νΈλ DOMμ μμΈμ€ν΄μΌ νλ κ²½μ° λμnextTick()
μ μ¬μ©νμ
<template>
<div class="container py-4">
<p id="message">{{ message }}</p>
</div>
</template>
<script>
import { onBeforeUpdate, onUpdated, ref } from "vue";
export default {
setup() {
const inputRef = ref(null);
const message = ref("");
onBeforeUpdate(() => {
console.log("onBefroeUpdate", message.value);
console.log(
"DOM Content:",
document.querySelector("#message").textContent,
);
});
onUpdated(() => {
console.log("onUpdated", message.value);
console.log(
"DOM Content:",
document.querySelector("#message").textContent,
);
});
return { inputRef, message };
},
};
</script>
<style lang="scss" scoped></style>
μΆλ ₯νλ©΄
λ°μν λ°μ΄ν° message
λ₯Ό μμ νκ²λλ©΄ μ½μμμ κ°μ νμΈν μ μλ€. onBeforeUpdate
λ DOM νΈλ¦¬λ₯Ό μ
λ°μ΄νΈνκΈ° μ΄μ μ΄κΈ° λλ¬Έμ DOM 컨ν
μΈ λ₯Ό κ°μ Έμμ λ μμ§ μ΄μ λ°μ΄ν°μΈ λΉκ°μΈ κ±Έ νμΈν μ μλ€. onUpdated
μ DOM νΈλ¦¬κ° λ³κ²½λ μ΄νμ νΈμΆλλ HOOKμ΄κΈ° λλ¬Έμ DOM 컨ν
μΈ λ₯Ό κ°μ Έμ€λ κ²μ νμΈν μ μλ€. λ€μ νλ² λ³κ²½ν΄λ³΄μ.
λ°μν λ°μ΄ν°λ λ³κ²½λ κ±Έ νμΈν μ μμ§λ§ DOM 컨ν
μΈ λ λ³κ²½λκΈ° μ΄μ μ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ κ²μ νμΈν μ μλ€. onUpdated
μ λ³κ²½λ νμ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ κ²μ νμΈν μ μλ€.
!!WARNING!!
onUpdated
ν
μμ μ»΄ν¬λνΈ μνλ₯Ό λ³κ²½νμ§ λ§μ. κ·Έλ¬λ©΄ 무ν μ
λ°μ΄νΈ 루νκ° λ°μ ν μ μλ€.!
ν΄μ²΄(μλ©Έ)λ¨κ³ μ΄λ©°
onBeforeUnmount
μonUnmounted
κ° μλ€.
μ»΄ν¬λνΈκ° λ§μ΄νΈ ν΄μ λκΈ° μ§μ μ νΈμΆ
μ»΄ν¬λνΈκ° λ§μ΄νΈ ν΄μ λ ν νΈμΆ
λΆλͺ¨
<template>
<div class="container py-4">
<button @click="visible = !visible">Toggle Child</button>
<LifeCycleChild v-if="visible"></LifeCycleChild>
<p id="message">{{ message }}</p>
</div>
</template>
<script>
import { onBeforeMount, onBeforeUpdate, onMounted, onUpdated, ref } from "vue";
import LifeCycleChild from "./LifeCycleChild.vue";
export default {
components: {
LifeCycleChild,
},
setup() {
const inputRef = ref(null);
const message = ref("");
const visible = ref(false);
return { inputRef, message, visible };
},
};
</script>
<style lang="scss" scoped></style>
μμ
<template>
<div class="card">
<div class="card-body">Lifecycle Child</div>
<input id="input" type="text" />
</div>
</template>
<script>
import { onBeforeMount, onBeforeUnmount, onMounted, onUnmounted } from "vue";
export default {
setup() {
onBeforeMount(() => {
console.log("[child] onBeforeMount");
});
onMounted(() => {
console.log("[child] onMount");
});
onBeforeUnmount(() => {
console.log("[Child] onBeforeUnmount");
console.log(document.querySelector("#input"));
});
onUnmounted(() => {
console.log("[Child] onUnmounted");
console.log(document.querySelector("#input"));
});
return {};
},
};
</script>
<style lang="scss" scoped></style>
μΆλ ₯νλ©΄
Toggle Child ν΄λ¦ μ LifeCycleChild.vue
μ»΄ν¬λνΈκ° μμ±λλ©° λ§μ΄νΈ λμκΈ° λλ¬Έμ [Child] onBeforeMount
μ [Child] onMount
κ° μ€νλλ κ±Έ λ³Ό μ μλ€.
Toggle child λ₯Ό λ€μ ν΄λ¦ν΄μ λ§μ΄νΈ ν΄μ , μλ©Έμν€λ©΄
\
[Child] onBeforeUnmount
κ³Ό [Child] onUnmounted
μ΄ νΈμΆλλ κ±Έ λ³Ό μ μλ€. [Child] onBeforeUnmount
μ λ§μ΄νΈλ₯Ό ν΄μ νκΈ° μ§μ μ νΈμΆνλ HOOKμ΄κΈ° λλ¬Έμ μμ§ DOMμ κ°μ Έμ¬ μ μμ§λ§ [Child] onUnmounted
λ λ§μ΄νΈλ₯Ό ν΄μ ν HOOKμ΄κΈ° λλ¬Έμ DOMμ κ°μ Έμμ λ μλ κ±Έ νμΈν μ μλ€.