2022. 3. 8. 00:28ใFront-End ์์ ์ค/Vue.js
๐ ๋ชฉ์ฐจ
[Vue.js] ๊ธฐ์ด ๊ฐ๋
์ ๋ฆฌ - ๊ธฐ๋ณธ ํ๊ฒฝ ๊ตฌ์ฑ
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - Vue Router
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - Vue LifeCycle Hook
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - data(), Data ์ฒ๋ฆฌ
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - Watch, Array, for๋ฌธ(๋ฐ๋ณต๋ฌธ), if๋ฌธ
๐ฑ Git Hub ์ฃผ์ : https://github.com/junyharang-FrontEnd-coding-study/vue.js-study
๐ ์ฐธ๊ณ ์๋ฃ : https://www.youtube.com/watch?v=sqH0u8wN4Rs
๐ ์ฐธ๊ณ ์๋ฃ : https://wormwlrm.github.io/2018/12/29/Understanding-Vue-Lifecycle-hooks.html
๐ VueLife Cycle Hook ์ด๋?
Vue ์ธ์คํด์ค๋, ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋ ๋, ์ฌ์ ์ ์ ์๋ ๋ช ๋จ๊ณ์ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋๋ฐ, ์ด๋ฅผ ์๋ช
์ฃผ๊ธฐ(Life Cycle)์ด๋ผ๊ณ ํ๋ ๊ฒ์ด์์.
Vue ์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋ค ์ฐ๋ฆฌ ๋์ ๋ณด์ฌ์ง๊ณ , ์ฌ๋ผ์ง๊ธฐ ๊น์ง์ ๋จ๊ณ๋ฅผ ๋งํ๋ต๋๋ค!
Vue ์ธ์คํด์ค๋ ํฌ๊ฒ ์์ฑ(Create)๋๊ณ , DOM์ ๋ถ๊ฒ(Mount)๋๊ณ , ์์ (Update)๋ ๋ค ์์ด์ง๋(Destroy) ํฌ๊ฒ 4๊ฐ์ง ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ ๊ฒ์ด์์.
์ด ๊ณผ์ ์์ Vue๋ ๊ฐ๊ฐ์ ๋จ๊ณ์์ Vue๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ์ํด Hook์ ํ ์ ์๋๋ก API๋ฅผ ์ ๊ณตํ๋ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ ์ข
๋ฅ๋ก๋ beforeCreate, created, beforeMount, mounted, beforeUpdate, updated, beforeDestory, destroyes๊ฐ ์๋ ๊ฒ์ด์์.
์์ ๊ทธ๋ฆผ์ ์ข ๋ ์ฌ์ด ๊ทธ๋ฆผ์ผ๋ก ๋ณผ ๊ฒ์ด์์.
beforCreate
Type : Function
๊ฐ๋ต : ์ธ์คํด์ค๊ฐ ์ด๊ธฐํ ๋ ๋ค Data ๊ด์ฐฐ ๋ฐ Event/Watcher(๊ฐ์์) ์ค์ ์ ์ ๋๊ธฐ์ ์ผ๋ก ํธ์ถ
์์ธ : Vue ์ธ์คํด์ค๊ฐ ์ด๊ธฐํ ๋ ๋ค ๋ฐ์๋๋๋ฐ, ์ปดํฌ๋ํธ๊ฐ DOM์ ์ถ๊ฐ๋๊ธฐ ์ ์ด๊ธฐ ๋๋ฌธ์ `this.$el`์ ์ ๊ทผํ ์ ์๋ค.
๋ํ, data, event, watcher์๋ ์ ๊ทผํ๊ธฐ ์ ์ด๊ธฐ ๋๋ฌธ์ data, methods ์๋ ์ ๊ทผํ ์ ์๋ค.
์์ ์ฝ๋
var app = new Vue({
el: '#app',
data() {
return {
msg: 'hello JunyHarang';
}
},
beforeCreate(function() {
console.log(this.msg); // undefined Error
})
})
created
Type : Function
๊ฐ๋ต : ์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋ค ๋๊ธฐ์ ํธ์ถ. ์ด ๋จ๊ณ์์ ์ธ์คํด์ค๋ data ๊ด์ฐฐ, computed ์์ฑ, methods, watch/ Event Call Back ๋ฑ์ ์ค์ ์ด ์ค๋น ๋์์์ ์๋ฏธํ๋ Option ์ฒ๋ฆฌ ์๋ฃ.
๋จ, Mount ๋จ๊ณ๊ฐ ์์๋์ง ์์ ๋จ๊ณ์ด๋ฉฐ, `$el`์ ์ฌ์ฉํ ์ ์๋ค.
์์ธ : data๋ฅผ ๋ฐ์ํ์ผ๋ก ์ถ์ ํ ์ ์๊ฒ ๋๋ฉฐ computed, methods, watch ๋ฑ์ด ํ์ฑํ ๋์ด ์ ๊ทผ์ด ๊ฐ๋ฅ.
ํ์ง๋ง, ์์ง๊น์ง DOM์๋ ์ถ๊ฐ๋์ง ์์ ์ํ.
data์ ์ง์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, Component ์ด๊ธฐ์ ์ธ๋ถ์์ ๋ฐ์์จ ๊ฐ๋ค๋ก data๋ฅผ Setting ํ๊ฑฐ๋, Event ๋ฆฌ์ค๋๋ฅผ ์ ์ธํด์ผ ํ๋ค๋ฉด ์ด ๋จ๊ณ์์ ํ๋ ๊ฒ์ด ์ ์ .
Option์ ์ค์ ๋ค์ ์๋ฃํ๋ ์์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์์ ์ฝ๋
var app = new Vue({
el: '#app',
data() {
return {
msg: 'hello JunyHarang';
}
},
created(function() {
console.log(this.msg); // hello JunyHarang
})
})
beforeMount
Type : Function
๊ฐ๋ต : ๋ง์ดํธ๊ฐ ์์๋๊ธฐ ์ง์ ํธ์ถ. render ํจ์๊ฐ ์ฒ์ ํธ์ถ.
์ด Hook์ ์๋ฒ์ธก ๋๋๋ง ์ค ํธ์ถ๋์ง ์๋๋ค.
์์ธ : DOM(html Code)์ ๋ถ๊ธฐ ์ง์ ํธ์ถ ๋๋ Hook์ผ๋ก ์ด ๋จ๊ณ ์ ์๋ ํ
ํ๋ฆฟ์ด ์๋์ง ์๋์ง ํ์ธ ๋ค ํ
ํ๋ฆฟ์ ๋๋๋ง ํ ์ํ์ด๊ธฐ์ ๊ฐ์ DOM์ด ์์ฑ ๋์ด์์ผ๋, ์ค์ DOM์๋ ๋ถ์ง ์์ ์ํ
์์ ์ฝ๋
var app = new Vue({
el: '#app',
beforeMount(function() {
console.log('beforeMount');
})
})
mounted
Type : Function
๊ฐ๋ต : ์ธ์คํด์ค๊ฐ ๋ง์ดํธ๋ ๋ค ํธ์ถ๋๋ฉฐ `Vue.createApp({}).mount()`๋ก ์ ๋ฌ๋ Element๋ ์๋ก ์์ฑ๋ `vm.$el`๋ก ๋์ฒด๋๋ค. Root ์ธ์คํด์ค๊ฐ ๋ฌธ์ ๋ด Element์ Mount ๋์ด ์์ผ๋ฉด `mounted`๊ฐ ํธ์ถ๋ ๋ `vm.$el`๋ ๋ฌธ์์ ํฌํจ(in-document)๋๋ค.
์์ธ : ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ Hook์ผ๋ก ๊ฐ์ DOM์ ๋ด์ฉ์ด ์ค์ DOM์ ๋ถ๊ณ ๋ ๋ค ์คํ๋๊ธฐ ๋๋ฌธ์ `this.$el`์ ๋น๋กฏํ data, computed, methods, watch ๋ฑ ๋ชจ๋ ์์์ ์ ๊ทผ์ด ๊ฐ๋ฅ.
์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ๋ถ๋ชจ์ ์์ ์ปดํฌ๋ํธ ๊ฐ mounted Hook ์์๋ ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ๋ค.
๋ถ๋ชจ ์ปดํฌ๋ํธ์ mounted Hook์ ํญ์ ์์ Component์ mounted Hook ์ดํ ๋ฐ์ํ๋ค.
ํ์ง๋ง ์์ ์ปดํฌ๋ํธ๊ฐ ์๋ฒ์์ ๋น๋๊ธฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๊ฒฝ์ฐ์ฒ๋ผ, ๋ถ๋ชจ์ mounted Hook์ด ๋ชจ๋ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ์ํ๋ฅผ ๋ณด์ฅํ์ง๋ ์๋๋ค. ๋ฐ๋ผ์ ์ด ๋๋ `this.$nextTick`์ ์ด์ฉํด ๋ชจ๋ ํ๋ฉด์ด ๋๋๋ง ๋ ๋ค ์คํํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ mount ์ํ๋ฅผ ๋ณด์ฅ ๋ฐ์ ์ ์๋ค.
์์ ์ฝ๋
var app = new Vue({
el: '#app',
mounted(function() {
console.log('mounted');
})
})
beforeUpdate
Type : Function
๊ฐ๋ต : DOM์ด ํจ์น๋๊ธฐ ์ Data๊ฐ ๋ณ๊ฒฝ๋ ๋ ํธ์ถ. ์ด ํ
์ update ์ ์ ๊ธฐ์กด DOM์ ์ ๊ทผ (์ : ์๋์ผ๋ก ์ถ๊ฐ๋ Event ๋ฆฌ์คํฐ๋ฅผ ์ ๊ฑฐ).
์์ธ : ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋๋ data์ ๊ฐ์ด ๋ณํด DOM์๋ ๊ทธ ๋ณํ๋ฅผ ์ ์ฉ์์ผ์ผ ํ ๋ ์ฌ์ฉํ๋ค. beforeUpdate Hook์ ๋ณํ ์ง์ ์ ํธ์ถ๋๋ ๊ฒ์ด๋ค. ๋ณํ ๊ฐ์ ์ด์ฉํด ๊ฐ์ DOM์ ๋๋๋งํ๊ธฐ ์ ์ด๋, ์ด ๊ฐ์ ์ด์ฉํด ์์
ํ ์ ์๋ค.
์ด Hook์์ ๊ฐ๋ค์ ์ถ๊ฐ์ ์ผ๋ก ๋ณํ ์ํค๋๋ผ๋ ๋๋๋ง์ ์ถ๊ฐ๋ก ํธ์ถํ์ง๋ ์๋๋ค.
์์ ์ฝ๋
var app = new Vue({
el: '#app',
beforeUpdate(function() {
console.log('beforeUpdate');
})
})
updated
Type : Function
๊ฐ๋ต : Data๊ฐ ๋ณ๊ฒฝ๋์ด ๊ฐ์ DOM์ด ๋ค์ ๋๋๋ง๋๊ณ , ํจ์น๋ ๋ค ํธ์ถ๋๋ค.
updated๊ฐ ํธ์ถ๋ ๋ ์ปดํฌ๋ํธ์ DOM์ด update ๋๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์ DOM์ ์ข
์์ ์ธ ์ฐ์ฐ(DOM-dependent operations)์ ํ ์ ์๋ค. ๊ทธ๋ฌ๋, ๋๋ถ๋ถ Hook ๋ด๋ถ์์ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์์์ผ ํ๋ค. ์ํ ๋ณ๊ฒฝ์ ๋ฐ์ํ๊ธฐ ์ํด ์ผ๋ฐ์ ์ผ๋ก computed property ์์ฑ์ด๋, watcher๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
updated๋ ๋ชจ๋ ํ์ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋๋๋ง ๋์์์ผ๋ก ๋ณด์ฅํ์ง ์๋๋ค. ์ ์ฒด ํ๋ฉด์ด ์ฌ ๋๋๋ง ๋ ๋๊ฐ์ง ๊ธฐ๋ค๋ฆฌ๋ ค๋ฉด, updated ๋ด๋ถ `vm.$nextTick`์ ์ฌ์ฉํ๋ค. ์ด Hook์ ์๋ฒ ์ธก ๋ ๋๋ง ์ค ํธ์ถ ๋์ง ์๋๋ค.
์์ธ : ๊ฐ์ DOM์ ๋ ๋๋ง ํ๊ณ ์ค์ DOM์ด ๋ณ๊ฒฝ๋ ๋ค ํธ์ถ ๋๋ Hook์ด๋ค. ๋ณ๊ฒฝ๋ data๊ฐ DOM์๋ ์ ์ฉ๋ ์ํ๋ก ๋ณ๊ฒฝ๋ ๊ฐ๋ค์ DOM์ ์ด์ฉํด ์ ๊ทผํ๊ณ ์ถ๋ค๋ฉด, updated Hook์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
๋ค๋ง, ์ด Hook์์ data๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ฌดํ ๋ฃจํ์ ๋น ์ง ์ ์๊ธฐ ๋๋ฌธ์ ์ง์ data๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ ๋งค์ฐ ์ํํ๋ค.
mounted Hook๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก `this.$nextTick`์ ์ด์ฉ ๋ชจ๋ ํ๋ฉด์ด update๋ ๋ค ์ํ๋ฅผ ๋ณด์ฅํ ์ ์๋ค.
์์ ์ฝ๋
var app = new Vue({
el: '#app',
updated(function() {
console.log('updated');
})
})
beforeDestroy
Type : Function
์์ธ : ํด๋น ์ธ์คํด์ค๊ฐ ํด์ฒด๋๊ธฐ ์ง์ beforeDestroy Hook์ด ํธ์ถ๋๋ค. ์์ง ํด์ฒด๋๊ธฐ ์ด์ ์ด๊ธฐ ๋๋ฌธ์ ์ธ์คํด์ค๋ ์์ ํ๊ฒ ์๋ ๋๊ณ ์๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ์์ฑ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. ์ด ๋จ๊ณ์์ Event ๋ฆฌ์คํฐ๋ฅผ ํด์ฒดํ๋ ๋ฑ ์ธ์คํด์ค๊ฐ ์ฌ๋ผ์ง๊ธฐ ์ ์ ํด์ผํ ์ผ๋ค์ ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
์์ ์ฝ๋
var app = new Vue({
el: '#app',
beforeDestroy(function() {
console.log('beforeDestroy');
})
})
destroyed
Type : Function
์์ธ : ์ธ์คํด์ค๊ฐ ํด์ฒด๋๊ณ ๋ ๋ค destroyed Hook์ด ํธ์ถ๋๋ค. ํด์ฒด๊ฐ ๋๋ ๋ค์ด๊ธฐ ๋๋ฌธ์ ์ธ์คํด์ค์ ์์ฑ์ ์ ๊ทผํ ์ ์๋ค. ๋ํ, ํ์ Vue ์ธ์คํด์ค ์ญ์ ์ญ์ ๋๋ค.
์์ ์ฝ๋
var app = new Vue({
el: '#app',
destroyed(function() {
console.log('destroyed');
})
})
ํ๋ฉด์ ์ด๋ป๊ฒ ์ฐํ๋์ง ๋ณด๊ธฐ ์ํด ์์ ๊ฐ์ด Life Cycle Hook์ ๋ชจ๋ ํจ์๋ฅผ ๋ง๋ค๊ณ , console.log๋ฅผ ํตํด ์ถ๋ ฅ ๋๋๋ก ํด ๋ณผ ๊ฒ์ด์์.
ํ๋ฉด์ ์ฒ์ ๋ค์ด์ค๊ฒ ๋๋ฉด console์ `beforeCreate, created, beforeMount, mounted`๊ฐ ์์๋๋ก ์ฐํ๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ ๊ฒ์ด์์.
์ด ์ํ์์ Data๋ฅผ ๋ณ๊ฒฝ์ ์ฃผ๋ Set Button์ ๋๋ฅด๋ ์๊ฐ `beforeUpdate, updated`๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ ๊ฒ์ด์์. ์์ ๊ทธ๋ฆผ์์ ๋ณด์๋ฏ์ด Data๊ฐ ๋ณ๊ฒฝ์ด ๋๋ฉด beforeUpdate์ updated๊ฐ ํธ์ถ ๋๋ฉด์ ๊ฐ์ DOM์ด Re Render๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด์์. ์ฆ, ํ๋ฉด์์ ์ด๋ค Data๊ฐ ๋ณ๊ฒฝ์ด ๋๋ฉด ์ด ๋ ๊ฐ๊ฐ ํธ์ถ ๋๋ ๊ฒ์ด์์.
Data ๋ณ๊ฒฝ Button์ ๊ด๋ จํด์๋ `์ด ๊ณณ`์ ์ฐธ๊ณ ํด ์ฃผ์ธ์!
์ฐ๋ฆฌ๊ฐ DB์์ ์ด๋ค ๊ฐ์ ๊ฐ์ ธ์์ ํ๋ฉด์ ๋ณด์ฌ์ค์ผ ํ๋ค๊ณ ๊ฐ์ ์ ํ์ ๋๋ created ๋จ์์ ํด๋น Data๋ฅผ ๊ฐ์ ธ์ค๊ฒ ํ๋ฉด ๋๋ ๊ฒ์ด์์. ๊ทธ๋ฐ ๋ค data()์์ ํด๋น ๋ด์ฉ์ ๊ฐ์ ธ์์ mounted ๋จ๊ณ์์ ํ๋ฉด์ ๋ณด์ฌ์ค ์ ์๊ฒ ํ ์ ์๋ ๊ฒ์ด์์.
์ด๋ฏธ Data๋ฅผ ๊ฐ์ ธ์จ ๋ค Data๊ฐ ๋ณ๊ฒฝ์ด ์ผ์ด๋๊ฒ ๋๋ค๋ฉด beforeUpdate์ updated ๋จ๊ณ์์ ์ด๋ค ์์ ์ ํด์ฃผ๋ฉด ๋๋ ๊ฒ์ด์์. beforeUpdate์ updated๋ Re Render๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ํ๋ฉด์ ์ถ๋ ฅ ๋๊ธฐ ์ Data๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค๋ฉด created ๋จ๊ณ์์ Data๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ค๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ง๋ต๋๋ค!
๐ InstanceLife Cycle Hook ์ด๋?
์ธ์คํด์ค ๋ผ์ดํ ์ฌ์ดํด์ด๋ Vue.js์ ์ธ์คํด์ค๊ฐ ์์ฑ๋์ด ์๋ฉธ๋๊ธฐ๊น์ง ๊ณผ์ ์ ์๋ฏธํฉ๋๋ค. ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ ๋๋ฉด Library ๋ด๋ถ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ด ์งํ๋๋ต๋๋ค.
โ DATA ์์ฑ์ ์ด๊ธฐ์ ๋ฐ ๊ด์ฐฐ (Reactivity ์ฃผ์
)
โ Vue Template Code Compile (Virtual DOM -> DOM ๋ณํ)
โ ์ธ์คํด์ค๋ฅผ DOM์ ๋ถ์ฐฉ
๐ฝ Life Cycle Diagram
์ธ์คํด์ค ๋ผ์ดํ ์ฌ์ดํด ํ๋ฆ์ ๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ ค๋ณด๋ฉด ์๋์ ๊ฐ์์.
๐ฝ Life Cycle Hook
Vue.js Life Cycle์ ์ด์ ํด์ผ ํ๋ ์ด์ ๋ ๋ฐ๋ก Life Cycle Hook ๋๋ฌธ์ด์์. Life Cycle Hook์ผ๋ก ์ธ์คํด์ค์ ํน์ ์์ ์ ์ํ๋ Logic์ ๊ตฌํํ ์ ์๊ธฐ ๋๋ฌธ์ด์ฃ .
์๋ฅผ ๋ค์ด Component๊ฐ ์์ฑ๋์๋ง์ Data๋ฅผ Server์์ ๋ฐ์์ค๊ณ ์ถ๋ค๋ฉด `create()`, `beforeMount` Life Cycle Hook์ ์ด์ฉํ ์ ์์ด์. ์๋ Code๋ ์ธ์คํด์ค๊ฐ ์์ฑ๋์๋ง๋ค `Axios`๋ฅผ ํตํด `HTTP Get Method`๋ฅผ ํตํด ์์ฒญ์ ๋ณด๋ด Data๋ฅผ ๋ฐ์์ค๋ Code์์.
new Vue({
methods: {
fetchData() {
axios.get(url);
}
},
created: function() {
this.fetchData();
}
})
'Front-End ์์ ์ค > Vue.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - Watch, Array, for๋ฌธ(๋ฐ๋ณต๋ฌธ), if๋ฌธ (0) | 2022.03.08 |
---|---|
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - data(), Data ์ฒ๋ฆฌ (0) | 2022.03.08 |
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - Vue Router (0) | 2022.03.07 |
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - ๊ธฐ๋ณธ ํ๊ฒฝ ๊ตฌ์ฑ (0) | 2022.03.07 |
[React] Router Dom (0) | 2021.10.09 |