설모의 기록
[vue.js] vue 인스턴스 생명주기 (life cycle) 본문
생명주기?
인스턴스의 상태에 따라서 호출할 수 있는 속성들을 생명주기(life cycle) 이라고 합니다. 그 속성마다 개발자가 추가한 커스텀 로직을 라이프 사이클 훅(life cycle hook) 이라고 합니다. 뷰 인스턴스도 객체이기 때문에 생명주기를 가집니다. 속성의 종류로는 beforeCreate, created, beforeMount, mounted, beforeUpdate, updated, beforeDestroy, destroyed 로 총 8개입니다. 아래에서 하나하나 살펴볼까요?
1. beforeCreate
> 인스턴스가 생성되고 나서 가장 처음으로 실행되는 라이프 사이클 단계입니다. 이 때는 뷰 인스턴스의 data 와 methods 속성이 정의되어 있지않고 화면 요소(ex. dom) 에도 접근할 수 없으니까 주의하세요!
2. created
> 이 단계에는 data 속성과 methods 속성이 정의되었기 때문에 두 속성값에 접근하는 로직을 구현하셔도 됩니다. 하지만 아직 화면 요소에 인스턴스가 부착되기 전이기 때문에 template 속성에 정의된 돔 요소에 접근하는 코드를 구현할 수는 없습니다.
3. beforeMount
> render() 함수가 호출되기 직전의 단계입니다. created 이후에 template 속성에 지정한 마크업 속성을 render() 함수로 변환한 후 el 속성에 지정한 화면 요소에 인스턴스를 부착하기 직전 호출되기 때문에 화면에 붙이기 전 실행해야 할 코드를 구현하시면 됩니다.
4. mounted
> el 속성에서 지정한 화면 요소에 인스턴스가 부착되고 난 후 호출되는 단계입니다. tgemplate 속성에 정의한 화면 요소에 접근할 수 있기 때문에 화면 요소를 제어하는 코드를 구현하시면 됩니다. 주의하실 것은 돔에 인스턴스가 부착되자마자 호출되기 때문에 하우 컴포넌트나 외부 라이브러리에 의해 추가된 화면 요소들이 최종 HTML 코드로 변환되는 시점과는 다를 수 있습니다.
5. beforeUpdate
> el 속성에서 지정한 화면 요소에 인스턴스가 부착되고 난 후에 인스턴스 속성들이 화면에 치환됩니다. 이 치환된 값을 $watch 속성으로 감시하는데요, 이러한 작업을 데이터 관찰이라고 합니다. 이렇게 관찰하고 있는 데이터들이 변경되면 가상 돔을 이용해 화면에 다시 그려야 합니다. 이 때, 그리기 직전 호출되는 단계가 beforeUpdate 입니다. 따라서 변경 예정인 데이터 값을 이용해 작업을 해야할 때 그 로직을 이 단계에서 구현하시면 됩니다. 또한 그 값을 변경하는 로직을 구현하셔도 다시 화면에 그려지지는 않습니다.
6. updated
> beforeUpdate 가 끝나고 화면에 다시 그리고 나면 실행되는 단계입니다. 데이터가 변경되고 화면 요소를 제어하는 것을 구현하고 싶을 때 이 단계에서 작업하시면 됩니다. 하지만 이 단계에서 그 값을 또 변경하면 무한 루프에 빠질 수 있습니다. 왜냐하면 여기서 값을 변경하면 다시 beforeUpdate -> updated (또 값 변경) -> beforeUpdate -> ... 이렇게 무한루프가 되기 때문입니다. 따라서 데이터 값을 갱신하는 로직은 beforeUpdate 에서 처리해주시길 바랍니다.
7. beforeDestroy
> 뷰 인스턴스가 destroy 되기 직전에 호출되는 단계입니다. 이 단계에서는 아직 인스턴스가 없어지지 않았기 때문에 접근 가능하며 뷰 인스턴스의 데이터를 삭제하거나 인스턴스가 사라지기 직전 해야하는 작업들을 구현하시면 됩니다.
8. destroyed
> 뷰 인스턴스가 destroy 되고 난 후 호출되는 단계입니다. 뷰 인스턴스에 정의한 모든 속성이 제거되고 하위에 선언했던 인스턴스들 역시 모두 destroy 됩니다.
코드
실제 코드에서는 뷰 객체 내에서 속성으로 추가하시면 됩니다. 아래는 예제 코드입니다.
이상으로 뷰 인스턴스의 생명주기에 대해 알아보았습니다 :)
참고 : do it! vue.js 입문 도서
'언어 > Vue.js' 카테고리의 다른 글
[Vue.js] router 사용해보기 (5) | 2018.03.10 |
---|---|
[Vue.js] vue-tiny-slider 모듈 사용하기 (1) | 2018.03.10 |
[vue.js] Vue.js 란 (0) | 2018.02.05 |