Programming Language/Vue

[Vue] 03)심화 문법

Sergemeow 2023. 5. 3. 14:40

computed

  • Vue instance가 가진 options 중 하나
  • computed 객체에 정의한 함수를 페이지가 최초로 렌더링 될 때 호출하여 계산
    • 계산 결과가 변하기 전까지 함수를 재호출하는 것이 아닌 계산된 값을 반환
  • 10_computed.html에서 methods와의 차이 확인

methods VS computed

  • methods
    • 호출 될 때마다 함수를 실행
    • 같은 결과여도 매번 새롭게 계산
  • computed
    • 함수의 종속 대상의 변화에 따라 계산 여부가 결정됨
    • 종속 대상이 변하지 않으면 항상 저장(캐싱)된 값을 반환

watch

  • 특정 데이터의 변화를 감지하는 기능
    • watch 객체를 정의
    • 감시할 대상 data를 지정
    • data가 변할 시 실행할 함수를 정의
  • 첫번째 인자는 변동 후 data
  • 두번째 인자는 변동 전 data
  • 실행 함수를 Vue method로 대체 가능
    • 감시 대상 data의 이름으로 객체 생성
    • 실행하고자하는 method를 handler에 문자열 형태로 할당
  • Array, Object의 내부 요소 변경을 감지를 위해서는 deep 속성 추가 필요

filters

  • 텍스트 형식화를 적용할 수 있는 필터
  • interpolation 혹은 v-bind를 이용할 때 사용 가능
  • 필터는 자바스크립트 표현식 마지막에 | (파이프)와 함께 추가되어야 함
  • 이어서 사용(chaining) 가능

중요 스타일 가이드

  • v-for는 항상 key와 함께 사용하기
  • v-for를 쓴 엘리먼트에 v-if를 사용하지 말기

1. v-for는 항상 key와 함께 사용하기

  • 내부 컴포넌트의 상태를 일관되게 유지하기 위해 v-for에 항상 key를 사용하기
  • 데이터의 예측 가능한 행동을 유지 시키기(객체 불변성)
todos: [
	{ id: 1, text: 'learn to use v-for'},
	{ id: 2, text: 'learn to use key'}
]

<!-- bad -- >
<ul>
	<li v-for="todo in todos">
		{{ todo.text }}
	</li>
</ul>
<!-- good -->
<ul>
	<li v-for="todo in todos":key="todo.id">
		{{todo.text}}
	</li>
</ul>

2. v-for를 쓴 엘리먼트에 절대 v-if를 사용하지 말기

2-1) 목록의 항목을 필터링 할 때

  • Vue가 디렉티브를 처리할 때 v-for는 v-if보다 우선순위가 높음
  • 즉 user의 일부분만 렌더링하고 싶은데도 불구하고, v-for가 우선순위를 가지기 때문에 모든 user에 대해 반복해야함
computed: {
	activeUsers(){
		return this.users.filter((user)=>user.isActive)
	}
}
<!-- bad -->
<ul>
	<li 
		v-for="user in users"
		v-if="user.isActive"
		:key="user.id"
	>
		{{ user.name }}
	</li>
</ul>

<!-- good -->
<ul>
	<li
		v-for="user in activeUsers"
		:key="user.id"
	>
		{{ user.name }}
	</li>
</ul>

2-2) 숨김 목록의 렌더링을 피할 때

  • v-if를 컨테이너 엘리먼트로 옮기기
    • 더 이상 목록의 모든 사용자에 대해 shouldShowUsers를 확인하지 않도록 함
  • 한번 확인하고 shouldShowUsers가 false인 경우 v-for를 평가하지도 않음
<!-- bad -->
<ul>
	<li
		v-for="user in users"
		v-if="shouldShowUsers"
		:key="user.id"
	>
		{{ user.name }}
	</li>
</ul>

<!-- good -->
<ul v-if="shouldShowUsers">
	<li
		v-for="user in users"
		:key="user.id"
	>
		{{ user.name }}
	</li>
</ul>