vue prop 객체 감지 안되는 경우

2021. 11. 23. 09:01·개발중/Vue.js
728x90
반응형

 vue 로 개발하는 와중에 부모 컴포넌트가 자식 컴포넌트에게 배열을 보내주는 상황에서

배열 안의 값이 하나가 변경될 경우 감지를 못하는 상황이 있었다.

 

이러한 경우 때문에 속앓이를 좀 했는데, 답을 찾았다.


data : {

        messages : []

        , newMessage : ' '

}

,  computed : {

    addDisabled() { ... }

}


Vue 가 인스턴스를 초기화 할 때 실제 데이터를 저장하기 위해

Vue 는 vm._data 를 만들고 vm.messages 와 vm.newMessages 에 대해

Object.defineProperty 로 게터와 세터를 정의해 두 프로퍼티에 접근하는 프락시를 만든다.

 

이렇게 해서 vm.message 에 접근하려고 하면 프락시에 의해 vm._data.messages 로 접근한다.

따라서 두 프로퍼티의 반응성은 실제로 vm._data 에서 발생한다.

 

vm.data 를 반응형으로 만들기 위해 Vue는 vm_data 를 관찰한다.

다시 말해 Vue 는 observer 객체를 생성하고 해당 객체를 vm._data ._ob_ 에 할당해 관찰 대상으로 표시한다.

 

이 observer 객체는 vm._data 의 모든 프로퍼티를 처리할 것이며,

이 책의 예제에서는 messages 와 newMassage 가 그에 해당한다.

 

newMassage 프로퍼티에 관해서는 그것이 원시 값이기 때문에

Vue는 단순히 반응형 게터와 반응형 세터를 정의하는 것 외에도 배열이기 때문에 Vue가 추가적인 관찰을 수항핸다.

 

추가적인 관찰을 수행하지 않으면 messages 의 배열의 변경 사항을 알아챌 수 없다.

 

왜냐하면 messages 프로퍼티의 반응형에

게터 vm._data.messages = [...]  를 통해 접근할 때만 호출 되기 때문이다.

 

Vue가 messages 배열을 관찰하는 경우 또 다른 Observer 객체를 만들어 배열 객체의 _ob_ vm 프로퍼티에 할당한다.

 

그리고 Vue 는 Array.prototype 의 .push() .pop() .shift(), unshift(), .splice(), sort(), reverse() 와 같은 원래의 변형 메소드를 감싸는 함수에서 와터에 데이터 변경 사항을 통지 하도록 Array.prototype 을 변경한다.

 

이렇게 해서 messages.push{(...)} 를 호출할 때 렌더 와처가 이를 감지하고

re-render 를 트리거해서 DOM 을 업데이트 한다. 

 

messages 배열 안에 객체를 저장하기 때문에 messages 배열 자체에 대한 Observer 객체를 생성하는 것 이외에도

Vue 는 배열안의 각 messages 객체를 관찰하기 위해 배열 안의 각 messages 객체에 대한 observer 객체를 생성한다.

 

이 객체는 messages 객체의 모든 프로퍼티를 살펴본 후 id 프로퍼티, text 프로퍼티, createAt 프로퍼티가 배열도 아니고

평범한 자바스크립트 객체도 아니라는 것을 알게 되고 단순히 이 프로퍼티에 대해 반응형 게터와 세터 함수를 정의한다.

 

이제 options 의 data 객체에 있는 모든 것이 반응형, 즉 관찰 가능하게 되었다.

data  객체의 구조가 아무리 복잡해도 Vue 는 모든 것이 반응형인지를 확인하기 위해 전체 구조를 살펴볼 것이다.


⭕ Vue 가 변경 내용을 츄적 할 수 없는 유형 두가지

자바스트립트는 아래와 같은 방식으로 배열에 변화가 생겼을 때 어떠한 이벤트도 발생시키지 않는다.

 

1. 인덱스로 배열에 아이템을 삽입하는 것.

vm.messages[index] = newItem 

 

2.  배열의 길이를 수정 하는 것.

vm.messages.length = newLength


⭕ 배열에 대한 반응성을 놓치고 싶지 않다면 ?

1. 변형 메소드 사용

배열에 대한 반응성을 놓치지 않으려면 변형 메소드를 사용해야 한다.

 

    - 변형 메소드 - push

        vm.messages.push(newItem)

 

    - 변형 메소드 - splce

        vm.messages.splce(0)

 

 

2. 객체에 새로운 프로퍼티를 추가 / 삭제

객체에 새로운 프로퍼티를 추가 / 삭제하는 방법도 존재한다.

 

    - 새로운 운 프로퍼티를 추가하는 방법

        messages.replicesCount = 0

 

    - 삭제하는 방법도 있다.

        delete messageObject.createdAt 


비전공자 개발자들의 개발팁 면접썰 국비썰 궁굼한건 댓글 달아주세요 😊 ❤


 

💚디벨빈수 브이로그 구독 좋아요 부탁드립니당💛

 

728x90
반응형
저작자표시 (새창열림)

'개발중 > Vue.js' 카테고리의 다른 글

[ vue ] Date Picker 날짜 차이 날 때 고정  (2) 2021.12.23
Vue computed 프로퍼티 처리 하는 방법.  (0) 2021.11.24
el-drawe Scrollbar 설정  (0) 2021.10.21
POMS Method Convention ☺❗  (0) 2021.10.05
Common Search Box Convention  (0) 2021.10.05
'개발중/Vue.js' 카테고리의 다른 글
  • [ vue ] Date Picker 날짜 차이 날 때 고정
  • Vue computed 프로퍼티 처리 하는 방법.
  • el-drawe Scrollbar 설정
  • POMS Method Convention ☺❗
Binsoo
Binsoo
내 트러블 슈팅
정수빈 기술블로그임.내 트러블 슈팅
  • Binsoo
    정수빈 기술블로그임.
    Binsoo
  • 전체
    오늘
    어제
    • 빈수 개발자 개발 일기 (932) N
      • 개발중 (634) N
        • Spring Boot (95)
        • Spring Security (2)
        • Spring Batch (6)
        • Spring Boot & Redis (13)
        • Java Persistence API (JPA) (28)
        • Web (42)
        • Rest Api (7)
        • Spring Concurrency Control (3)
        • Redis (8)
        • Kubernetes (k8s) (4)
        • MYSQL (35)
        • AirFlow (15)
        • Docker (2)
        • Git (22)
        • Linux (9)
        • JSON Web Tokens (JWT) (4)
        • Troubleshooting (87)
        • Swagger (0)
        • Vue.js (52)
        • Java (74)
        • html (12)
        • C (5)
        • jQuery (15)
        • JavaServer Pages (JSP) (17)
        • Arduino (1)
        • JavaScript (35)
        • Amazon Web Services (AWS) (11)
        • Algorithm (9)
        • 참고 기능 (18) N
        • mongo (2)
      • PROJECT (27)
        • 스프링부트+JPA+몽고 API 개발 (3)
        • MINI (2)
        • 게시판 (3)
        • vue 프로젝트 (1)
        • JPA 사이드 프로젝트 기록 (17)
      • TEAM STUDY (156)
        • 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (8)
        • 한 권으로 읽는 컴퓨터 구조와 프로그래밍 (12)
        • NAVER DEVELOPER (4)
        • LINUX (23)
        • PYTHON (19)
        • SERVER (8)
        • 알고리즘 코딩 테스트 스터디 (31)
        • 쿠버네티스 (40)
        • 대세는 쿠버네티스 [초급~중급] (11)
      • BOOK (0)
      • 자격증 (61)
        • 리눅스 1급 - 필기 기록 (19)
        • 네트워크 관리사 (2)
        • 네트워크 관리사 2급 - 실기 기록 (21)
        • 네트워크 관리사 2급 - 필기 기록 (16)
        • 정보처리 (2)
      • 직장인 대학원 (17)
        • 기록 (1)
        • 캐글 스터디 (3)
        • R (12)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    네트워크 관리사 2급
    REST API
    리눅스 마스터 1급
    Git 저장소
    리눅스 마스터 1급 정리
    git
    리눅스 마스터
    스프링
    쿠버네티스
    네트워크 관리사
    BackendDevelopment
    java
    네트워크 관리사 요약
    쿠버네티스 스터디
    Spring
    파이썬 알고리즘
    springboot
    네트워크 관리사 2급 실기
    리눅스 1급 요약
    redis
    파이썬
    VUE
    알고리즘
    리눅스 마스터 요약
    네트워크 관리사 학점
    jpa
    네트워크 관리사 자격증
    리눅스 마스터 1급 요약
    네트워크 관리사 실기
    docker
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Binsoo
vue prop 객체 감지 안되는 경우

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.