라이프사이클 훅을 통해, 컴포넌트가 언제 생성되어, DOM에 추가되고, update되고, destoy 되는지를 알 수 있다.
Vue 인스턴스가 생성될 때, 일련의 초기화 과정을 거치게 된다.
그러한 경우에, 라이프 사이클 훅(lifecycle hook) 이라는 함수를 호출하게 된다. 이는 유저에게 사용자 정의 로직을 특정 stage에 실행시킬 수 있게 한다.
라이프 사이클 훅의 예로 created
, mounted
, updated
, destroyed
가 있다. 모든 라이프사이클 훅은 해당 함수를 호출한 뷰 인스턴스를 가리키는 this
context와 함께 호출된다. 따라서 화살표함수를 콜백이나 options 프로퍼티에 사용하면 안된다. options 객체는 인스턴스를 만들 때 넘기는 객체이다.
new Vue({
data: {
a: 1,
},
created: function () {
// this는 vm 인스턴스를 가리킨다.
// 화살표함수는 this에 vm을 가리키지 않으므로, 사용해서는 안된다...!
console.log(`a : ${this.a}`);
},
});
creation hook은 컴포넌트가 DOM에 추가되기 전에 무언가 액션을 할 수 있게 한다.
client rendering이나 server rendering을 하는 동안에 무엇가를 세팅하는 작업을 할 수 있다.
다른 훅들과는 다르게 서버사이드 렌더링에도 이 훅은 호출된다.
new Vue({
el: "#app",
data: {
count: 10
},
beforeCreate: function () {
console.log('Nothing gets called at this moment')
// `this` points to the view model instance
console.log('count is ' + this.count); // undefined
},
created: function () {
// `this` points to the view model instance
console.log('count is: ' + this.count) // 10
}
})
인스턴스가 초기화된 직후에 동기적으로 호출된다.
이 시점에는 Data observation과 event/watcher가 설정되기 전이다.
이 훅은 인스턴스가 create된 직후에 동기적으로 호출된다.
이 훅이 호출된 시점에는 이벤트와 data observation에 대한 설정이 끝난 후이다.
즉,
이 설정된 후다.
그러나 마운트 단계 전이기 때문에, $el
프로퍼티는 아직 사용가능하지 않다.
마운트 전에 호출된다. 처음으로 render함수가 호출된 후이다.
서버사이드 렌더링시에는 호출되지 않는다.
instance가 마운트된 이후에 호출된다. 여기서의 마운트란 el가 새로 생성된 vm.$el로 대체되는 것을 말한다.
이 시점에서 Reactive component, template, rendered DOM에 완전히 접근할 수 있다.
<div id="app">
<div>
this is textContent
</div>
</div>
new Vue({
el: "#app",
mounted(){
console.log('---Mount---');
console.log(this.$el.textContent); // this is textContent
}
})
주의할 점은 mounted가 모든 자식 컴포넌트들 또한 마운트되었음을 보장하지는 않는다는 것이다. 전체적인 뷰가 렌더링되기를 기다린다면, vm.$nextTick
를 사용하면 된다.
mounted: function () {
this.$nextTick(function () {
// Code that will run only after the
// entire view has been rendered
})
}
서버사이드 렌더링시에는 호출되지 않는다.
리렌더링될 때나, 반응형 프로퍼티가 변경될 때 호출된다.
<div id="app">
<p ref="dom">
{{this.counter}}
</p>
</div>
new Vue({
el: "#app",
data() {
return {
count: 10,
counter: 0,
}
},
created: function () {
setInterval(() => {
this.counter++
}, 1000)
},
beforeUpdate(){
console.log(+this.$refs['dom'].textContent === this.counter); // false
},
updated(){
console.log(+this.$refs['dom'].textContent === this.counter); // true
}
})
데이터가 변경된 후이고, DOM에 적용되어 리렌더링되기 직전에 호출된다.
서버사이드 렌더링에서는 호출되지 않는다.
데이터가 변경이 VDOM이 리렌더링되고 patch되게한 이후에 호출된다.
이 훅안에서 state를 변경하는 것은 하지 않아야 한다.
state 변경에 반응하기 위해서, computed나 watcher를 사용하는 것이 더 좋다.
updated 훅이 모든 자식 컴포넌트 또한 리렌더링된 것을 보장하지 앟ㄴ는다.
전체 뷰가 리렌더링될 때까지 기다리고 싶을 경우, vm.$nextTick
을 사용해야 한다.
서버사이드 렌더링에서는 호출되지 않는다.
component가 없어질 때, 사용할 수 있는 훅이다.
cleanup이나, 분석할 때 사용할 수 있다.
vue instance가 없어지기 바로 전에 호출된다.
이벤트를 없애거나, 반응형 구독을 없애고 싶을 때 beforeDestory에서 하면 된다.
이 시점에 컴포넌트는 functional하다.
vue instance가 없어진 후에 호출된다. 이 훅이 호출된 시점에, 모든 directive는 바인드가 없어졌으며, 모든 이벤트 리스너가 제거된 상태이다.
또한, 모든 자식 인스턴스들도 없어진 상태이다.
keep-alive component가 activate되었을 때, 호출된다.
서버사이드 렌더링시에는 호출되지 않는다.
keep-alive component가 deactivate 되었을 때, 호출된다.
서버사이드 렌더링 시에는 호출되지 않는다.
or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Syncing