몽땅뚝딱 개발자

[Vue.js] computed vs watch 속성 본문

Development/Vue.js

[Vue.js] computed vs watch 속성

레오나르도 다빈츠 2022. 1. 10. 15:15

 

새삼 생각나는 코딩테스트 때 watch 남발했다가 '왜 이렇게 쓰신거예요?'라는 물음에 놀라고 제대로 개념 잡힌 기억..(🥲)

watch는 어떤 때에 쓰는 것이며, 성능에 어떤 영향을 미치는지 매우 친절히 설명해주셔서 그 뒤로는 plan B로 사용하게 됐다.

 

예전에 내가 짠 코드를 보면 왜 그렇게, 왜 그곳에서 써야하는지 명확한 이유도 없이 마구잡이로 사용했었다.

물론 지금도 100% 적절하게 쓴다고 확신할 수는 없지만 그래도 함수 하나, 데이터 하나를 선언할 때도 과연 적절한 옵션에서 사용하고있는건지 고민해보고 판단하는 단계까지는 왔다.

 

 

 


 

 

◽ computed

  • 계산해야하는 목표데이터를 정의하는 방식으로, 선언적 프로그래밍 방식이다.
  • computed 속성은 해당 속성이 종속된 대상이 변경될 때만 실행되며 캐싱된다. 예를 들어 아래의 reverseMessage()의 경우 종속되어있는 this.message의 값이 바뀌지 않는 한 계속 호출하더라도 이미 계산되어 있는 값을 리턴한다.
  • computed 대신에 methods hook에서 함수를 선언하여 호출해도 되지만 함수의 경우 렌더링될 때 마다 호출되기 때문에 비효율적일 수 있다.
  • computed를 사용할 때의 주의사항으로는 계산된 결과를 리턴하는 것 외에 사이드 이펙트를 부르는 코드는 지양하는 것이 좋다.
export default {
    computed: {
    	// return 형식으로 작성해야 한다.
        // 표현식에서 {{ reverseMessage() }}로 호출할 수도 있다.
        reversedMessage() {
            return this.message.split('').reverse().join('')
        },
        
        // getter, setter를 선언
        testValue: {
            get() {
            	// getter
            },
            set(val) {
            	// setter
            }
        }
    }
}

 

 

◽ Watch

  • 데이터가 바뀌면 함수를 실행하는 방식으로, 명령형 프로그래밍 방식이다.
  • 보통은 computed가 더 적합하지만, watch가 더 적합하게 사용될 때도 있다. 예를 들어, watch는 어떤 프로퍼티의 변경시점에 어떤 액션(call api, push route …)을 취하고자 할때 적합하다. watch 옵션을 사용하면 비동기 연산을 수행하고, 최종 response가 오기 전 중간에 실행할 동작을 설정할 수도 있다. (computed 속성은 이러한 기능을 수행할 수 없다.)
export default {
    watch: {
        question(newQuestion) {
            this.answer = '입력을 기다리는 중...'
            this.debouncedGetAnswer()
        }
    },
}

 

 

 

출처

https://kr.vuejs.org/v2/guide/computed.html

[Vue.js] watch와 computed 의 차이와 사용법

 

 

 


개인적으로 공부한 내용을 정리하는 블로그로
잘못된 개념을 게시하지않도록 주의하고 있으나 오류가 있을 수 있습니다.

 

 

'Development > Vue.js' 카테고리의 다른 글

[Vue.js] v-model  (0) 2022.01.12
[Vue.js] $attrs  (0) 2022.01.11
[Vue.js] Vuex란?  (0) 2022.01.10
[Vue.js] 빌트인 컴포넌트 - transition  (0) 2022.01.10
[Vue.js] 디렉티브(Directive) - (2)  (0) 2022.01.06
Comments