Vue 3 Compositon API에 있는 ref()
의 얕은 버전이다. Vue.js 문서
function shallowRef<T>(value: T): ShallowRef<T>
interface ShallowRef<T> {
value: T
}
ref()
와 달리 shallowRef()
의 내부 값은 있는 그대로 저장되고 노출되며 내부 깊숙이까지 반응형으로 동작하지는 않는다. .value
접근만 반응형이다.
객체 내부의 속성 변경을 추적하지 않고, Ref의 value
가 변경될 때만 반응성을 트리거하는 특징이 있다.
깊은 반응성 (ref)
일반적인 ref
는 객체 내부의 모든 속성을 반응적으로 감지한다. 내부 속성이 바뀌어도 반응성을 트리거한다.
import { ref } from 'vue';
const state = ref({ count: 1 });
state.value.count = 2; // 반응성을 트리거
console.log(state.value.count); // 2
얕은 반응성 (shallowRef)
shallowRef
는 객체 내부 속성 변경은 반응성을 트리거하지 않으며, value 자체가 변경될 때만 반응성을 트리거한다.
import { shallowRef } from 'vue';
const state = shallowRef({ count: 1 });
state.value.count = 2; // 반응성을 트리거하지 않음
console.log(state.value.count); // 2 (값은 변경되지만 반응성 X)
state.value = { count: 3 }; // 반응성을 트리거 console.log(state.value.count); // 3
기본 사용법
import { shallowRef } from 'vue';
const user = shallowRef({ name: 'Alice', age: 25 });
// 내부 속성 변경
user.value.name = 'Bob'; // 반응성을 트리거하지 않음
// 전체 객체 교체
user.value = { name: 'Charlie', age: 30 }; // 반응성을 트리거
배열의 경우
배열에 shallowRef
를 사용하면, 배열의 요소 변경은 반응성을 트리거하지 않는다.
const items = shallowRef([1, 2, 3]);
items.value[0] = 99; // 반응성을 트리거하지 않음
items.value = [4, 5, 6]; // 반응성을 트리거
성능 최적화
외부 데이터 관리
반응성 수동 제어
특징 | shallowRef | 일반 ref |
---|---|---|
반응성 추적 범위 | value 자체만 | 객체 내부의 속성까지 추적 |
객체 속성 변경 트리거 여부 | 트리거 X | 트리거 O |
주요 사용 목적 | 성능 최적화 및 외부 데이터 관리 | 모든 변경 사항을 추적해야 하는 경우 |
import { shallowRef, onMounted } from 'vue';
const chart = shallowRef(null);
onMounted(() => {
// 외부 라이브러리로 차트를 생성
chart.value = createChartLibraryInstance();
});
return { chart }
외부 라이브러리 객체는 Vue의 반응성 시스템이 세부적으로 추적할 필요가 없으므로, shallowRef
로 관리하면 불필요한 반응성을 줄일 수 있다.