Vue 2.0 생명주기 이해

인터넷 에는 vue 생명주기 에 관 한 글 이 많이 있 습 니 다.제 글 의 유래 는 사실은 제 가 홈 페이지 에서 묘사 한 한 마디 에 대한 사고 와 이해 입 니 다."el 이 새로 만 든 vm.$el 로 교체 되 었 습 니 다."그래서 글 의 더 많은 내용 은 vue 생명주기 에서'created->beforeMount->mounted'과정 에 대한 이해 일 수 있 습 니 다.
beforeCreate-->created 사이
이 단계 에서 사건 을 초기 화하 고 데이터 관측 을 한다.
created
vue 인 스 턴 스 생 성 후 호출 되 었 습 니 다.이 때 데이터 관측(data observer),속성 과 방법의 연산,watch/event 이벤트 리 셋 설정 이 완료 되 었 습 니 다.
methods 의 방법 을 호출 하여 data 의 데 이 터 를 방문 하고 수정 하 며 응답 식 변 화 를 촉발 하여 DOM 렌 더 링 을 업데이트 시 키 고 watch 에 해당 하 는 방법 을 촉발 하여 coptute 관련 속성 을 다시 계산 할 수 있 습 니 다.
일반적으로 created 에서 ajax 요청 을 통 해 인 스 턴 스 데 이 터 를 초기 화 합 니 다.
이 때 vm.$el 이 보이 지 않 습 니 다.
created-->beforeMount 사이

 이 과정 에서
a.인 스 턴 스 에 엘 옵션 이 있 는 지 먼저 판단 하고,있 으 면 계속 아래로 컴 파일 합 니 다.없 으 면 컴 파일 을 중단 합 니 다.vm.$mount(el)가 호출 될 때 까지 계속 합 니 다(엘 은 마 운 트 된 DOM 노드 입 니 다).
b.다음 에 인 스 턴 스 에 template 가 있 는 지 판단 하고 있 으 면 템 플 릿 으로 rander 함수 로 컴 파일 합 니 다.
c.template 가 없 으 면 DOM 요 소 를 마 운 트 한 html(즉,el 에 대응 하 는 DOM 요소 와 내부 요소)를 템 플 릿 으로 추출 하여 컴 파일 합 니 다.
*주:엘 에 대응 하 는 DOM 요 소 는 body/html 요소 가 될 수 없습니다.뒤에 vue 인 스 턴 스 가 마 운 트 될 때 엘 에 대응 하 는 DOM 요소 와 내부 요 소 는 템 플 릿 에 나타 난 새로운 DOM 으로 바 뀌 기 때 문 입 니 다.
d.인 스 턴 스 대상 에 rander 함수 가 있 으 면 직접 렌 더 링 작업 을 합 니 다.
우선 순위:rander 함수>template>외부 html
이 때 랜 더 함수 가 준비 되 어 있 고 처음으로 호출 되 었 습 니 다.
이 과정 에서$el 은 인 스 턴 스 에서 el 옵션 에 대응 하 는 DOM 요소 로 초기 화 되 었 기 때문에 beforeMount 에서 vm.$el 로 DOM 요 소 를 마 운 트 한 html 를 가 져 왔 습 니 다.
beforeMount
 beforeMount 가 호출 되 었 을 때$el 을 볼 수 있 습 니 다.
beforeMount-->마 운 트 된 사이
이 과정 에서 엘 은 새로 만 든 vm.$el 로 교체 되 고 인 스 턴 스 마 운 트 를 완료 합 니 다.즉,인 스 턴 스 의 엘 옵션 은 템 플 릿 렌 더 링 에 의 해 만들어 진 DOM 요소 로 바 뀌 었 고 페이지 의 마 운 트 지점 이 렌 더 링 된 vue 인 스 턴 스 코드 세그먼트 로 바 뀌 었 습 니 다.
Mounted
이 때 인 스 턴 스 가 DOM 에 마 운 트 되 었 습 니 다.DOM API 를 통 해 인 스 턴 스 의 DOM 노드 를 가 져 올 수 있 습 니 다.콘 솔 에서 vm.$el 을 인쇄 하 였 습 니 다.이전 마 운 트 지점 과 내용 이 새 DOM 으로 바 뀌 었 음 을 발 견 했 습 니 다.
다음은 밤 을 통 해 이 두 과정 을 살 펴 보 자.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <script src="https://cdn.bootcss.com/vue/2.5.13/vue.min.js"></script>
</head>
<body>
<div id="app">
  <a id='ela' href="">{{message}}</a>
</div>
</body>
<script>
  var app = new Vue({
    el: '#app',
    data: function () {
      return {
        message: 'hello'
      };
    },
    template: '<p id="elp">{{message}}</p>',
    beforeMount: function () {
      console.group('beforeMount      ===============》');
      let state = {
        'el': this.$el,
        'data': this.$data,
        'message': this.message
      }
      let a = document.getElementById('ela');
      let p = document.getElementById('elp');
      console.log(this.$el);
      console.log(state);
      console.log(a);  // <a id='ela' href="">{{message}}</a>
      console.log(p);   // null
    },
    mounted: function () {
      console.group('mounted       ===============》');
      let state = {
        'el': this.$el,
        'data': this.$data,
        'message': this.message
      }
      let a = document.getElementById('ela');
      let p = document.getElementById('elp');
      console.log(this.$el);
      console.log(state);
      console.log(a);  // null
      console.log(p);   // <p id="elp">father</p>
    }
</script>
</html>

template/rander 옵션 을 사용 하면 콘 솔 에서 똑똑히 볼 수 있 습 니 다.마 운 트 가 완료 되면 엘 은 새로 만 든 vm.$el 로 대 체 됩 니 다.
마 운 트 하기 전에 초기 엘 과 가상 DOM 형식 으로 존재 합 니 다.이 때 template 의 내용 을 템 플 릿 으로 하고 템 플 릿 의 내용 을 볼 수 없 으 며 인쇄 p 라벨 은 null 입 니 다.
마 운 트 후 템 플 릿 렌 더 링 의 새 DOM 은 원래 의 el 을 교체 합 니 다.원래 의 el 에 대응 하 는 DOM 이 존재 하지 않 습 니 다.a 탭 을 null 로 인쇄 합 니 다.
 beforeUpdate 와 updated
data 대상 에서 데이터 가 업 데 이 트 될 때 beforeUpdate 갈 고 리 를 터치 합 니 다.이 때 view 층 은 업데이트 되 지 않 았 습 니 다.beforeUpdate 에는 다음 과 같은 몇 가지 주의 할 점 이 있 습 니 다.
a.업 데 이 트 된 데 이 터 는 템 플 릿 에서 직접 또는 간접 적 으로 사용 해 야 beforeUpdate 를 실행 할 수 있 습 니 다.
b、마 운 트 하기 전에 data 에서 데이터 업 데 이 트 는 beforeUpdate 를 실행 하지 않 습 니 다!즉,created,beforeMount 에서 데 이 터 를 바 꿀 때 업데이트 절 차 를 실행 하지 않 습 니 다.
c.beforeUpdate 에서 이 데이터 의 값 을 다시 수정 하면 beforeUpdate 갈 고 리 를 다시 터치 하여 두 번 업데이트 절 차 를 진행 합 니 다.
updated 시 view 층 이 업데이트 되 었 습 니 다.
(위의 코드 에 갈고리 두 개 추가)

mounted: function () {
  this.message = 'first';
//   this.show = false;    //          show,  show       beforeUpdate
},
beforeUpdate: function () {
  console.group('beforeUpdate      ===============》');
  let elp = document.getElementById('elp').innerHTML;
  console.log('message:' + this.message);
  console.log('DOM:' + elp);
},
updated: function () {
  console.group('updated       ===============》');
  let elp = document.getElementById('elp').innerHTML;
  console.log('message:' + this.message);
  console.log('DOM:' + elp);
}

여기 서 주의해 야 할 점 이 있 습 니 다.view 층 은 innerHTML 을 통 해 해당 요소 노드 의 내용 을 가 져 와 야 합 니 다.요소 노드 를 직접 가 져 올 수 없습니다.요소 노드 를 직접 가 져 옵 니 다.콘 솔 에서 인쇄 된 view 층 의 데 이 터 는 모두 업 데 이 트 된 상태 입 니 다.실시 간 으로 정확 한 값 을 출력 할 수 없습니다.이것 은 Chrome 콘 솔 의 출력 과 관련 이 있 을 것 입 니 다.
세 번 째 조 에 대해 다음 코드 시연 을 살 펴 보 겠 습 니 다.

mounted: function () {
  this.message = 'first';
},
beforeUpdate: function () {
  console.group('beforeUpdate      ===============》');
  let elp = document.getElementById('elp').innerHTML;
  console.log('message:' + this.message);
  console.log('DOM:' + elp);
  this.message = 'second';  //    beforeUpdate      message  
},
updated: function () {
  console.group('updated       ===============》');
  let elp = document.getElementById('elp').innerHTML;
  console.log('message:' + this.message);
  console.log('DOM:' + elp);
}

여기 서 우 리 는 두 번 의 업데이트 절 차 를 진행 한 것 을 똑똑히 볼 수 있 지만 인쇄 결과 에 대해 의문 이 있 습 니 다.처음으로 message 의 값 을 first 로 바 꾸 고 first 로 DOM 을 업데이트 하 는 것 을 보 여 줍 니 다.그러면 첫 번 째 updated 를 호출 할 때 message 와 DOM 의 값 은 모두 first 이 어야 합 니 다.이때 인쇄 될 때 second 입 니 다.제 가 이해 하 는 것 은 첫 번 째 updated 를 실 행 했 을 때 DOM 은 두 번 째 렌 더 링 업 데 이 트 를 완 성 했 고 구체 적 인 과정 은 그 후에 소스 코드 에 대한 학습 을 통 해 이해 해 야 한 다 는 것 입 니 다.여기 서 여러분 은 서로 다른 이해 나 더 자세 한 설명 이 있 으 면 댓 글 에 댓 글 을 달 고 함께 공부 할 수 있 습 니 다.
여기 서 우 리 는 beforeUpdate 에 타 이 머 를 추가 하여 message 의 값 을 수정 할 수 있 습 니 다.첫 번 째 데이터 변 화 를 기다 릴 수 있 습 니 다.DOM 업데이트 렌 더 링 이 완 료 된 후에 두 번 째 데이터 변 화 를 진행 할 수 있 습 니 다.

beforeUpdate: function () {
  console.group('beforeUpdate      ===============》');
  let elp = document.getElementById('elp').innerHTML;
  console.log('message:' + this.message);
  console.log('DOM:' + elp);
  var that = this;
  setTimeout(function(){
    that.message = 'second';
  });
//  this.message = 'second';  //    beforeUpdate      message  
},

두 번 의 데이터 가 바 뀌 었 을 때 데이터 와 view 층 의 업데이트 상 태 를 볼 수 있 습 니 다.
beforeDestroy 와 destroyed
beforeDestroy:인 스 턴 스 는 소각 하기 전에 호출 됩 니 다.이 인 스 턴 스 는 여전히 사용 할 수 있 습 니 다.
beforeDestroy->destroyed:Vue 인 스 턴 스 가 지시 하 는 모든 것 이 바 인 딩 되 고 모든 이벤트 모니터 가 제거 되 며 모든 하위 인 스 턴 스 도 소 멸 됩 니 다.
destroyed:vue 인 스 턴 스 를 소각 하고 호출 합 니 다.
끝:vue 생명주기 에 대한 정리 가 끝 났 습 니 다.잘못된 부분 이 있 으 면 지적 해 주 십시오.제때에 수정 하 겠 습 니 다!
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기