[Vue] Computed 속성

    # Computed()

    계산된 속성을 정의하는 함수

    미리 계산된 속성을 사용하여 템플릿에서

    표현식을 단순하게 하고, 불필요한 반복 연산을 줄인다.

     

    예를 들어,

    <p>{{ todos.length > 0 ? '아직 남았다' : '퇴근!' }}</p>

    이런식으로 todos라는 object의 길이에 따라 메세지를 출력할 때, 

    todos의 length를 계속 계산하게 됨

    만약 이 계산을 템플릿에서 계속 쓴다면 복잡해짐

    → 미리 계산을 해두고, 계속 가져오자

    ▶ 그때 쓰는게 computed!

     

     

    한번 computed로 바꿔볼까

    const { createApp, ref, computed } = Vue

    computed를 쓰기 위해  가져오고

    const restOfTodos = computed(() => {
      return todos.value.length > 0 ? '아직 남았다' : '퇴근!'
    })

    setup안에 restOfTodos라는 함수를 만들어준다.  이때, script안이므로 todos에 value 추가해주기

    <p>{{ restOfTodos }}</p>

    기존의 HTML안에는 restOfTodos로 바꿔준다

     

     

    • 이때 반환되는 값은 computed ref이며, 일반 refs와 유사하게 계산된 결과를 .value로 참조 가능!
    • computed 속성은 의존된 반응형 데이터를 자동으로 추적
    • 의존하는 데이터가 변경될 때만 재평가 → 즉, todos가 변경될 떄만 restOfTodos가 업데이트 됨'

     

     

    근데 computed 대신에 그냥 method 쓰면 안되나?

    const getRestOfTodos = function () {
      return todos.value.length > 0 ? '아직 남았다' : '퇴근!'
    }

    이런식으로

    • computed 속성은 의존된 반응형 데이터를 기반으로 캐시(cached)됨
    • 의존하는 데이터가 변경된 경우에만 재평가
    • 즉, 의존하는 데이터(todos)가 변경되지 않는한, 처음한 계산 그대로 → 계산을 여러번 안함

    하지만, 메서드는 랜더링 할 때마다 함수를 다시 실행 → 아까 맨위에 함수를 안에 쓴거랑 비슷함

     

    더보기

     

    여기서 캐시(cache)란?

    데이터나 결과를 일사적으로 저장해두는 임시 저장소

    이후에 같은 데이터나 결과를 다시 계산하지 않고 빠르게 접근할 수 있도록 한다

    이런식으로 웹페이지들은 캐시를 사용한다 (주로 이미지)

     

    그래서 computed랑 method는 각각

    • computed
      • 의존하는 데이터에 따라 결과가 바뀌는 계산된 속성을 만들 때 유용
      • 동일한 의존성을 가진 여러 곳에서 사용할 때 계산 결과를 캐싱하여 중복 계산 방지
      • 의존된 데이터가 변경되면 자동으로 업데이트
    • method 
      • 단순히 특정 동작을 수행하는 함수를 정의할 때 사용
      • 데이터에 의존하는지 여부와 관계없이 항상 동일한 결과를 반환
      • 호출해야만 실행 됨

    ▶ 각각의 상황에 맞게 쓰자

     

     

     

     


    ※ computed의 반환 값은 변경하지 말 것

    computed의 반환 값은 의존하는 데이터의 파생된 값이므로

    읽기 전용으로만 쓰자

     

    ※ computed 사용 시 원본 배열은 변경하지 말 것

    return numbers.reverse() //하지말기
    
    return [...numbers].reverse() //복사본 만들어서 진행

    'FrontEnd > Vue' 카테고리의 다른 글

    [Vue] List Rendering(v-for)  (0) 2023.11.06
    [Vue] Conditional Rendering(v-if, v-show)  (0) 2023.11.06
    [Vue] TodoList 만들어보기  (0) 2023.11.02
    [Vue] Form Input Bindings  (0) 2023.11.02
    [Vue] v-on  (0) 2023.11.02

    댓글