본문 바로가기

개발중/Vue.js

vue prop 객체 감지 안되는 경우

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