import { reactive, toRefs } from 'vue'
const state = reactive({
count: 0,
name: '홍길동',
})
// 구조 분해 할당 시 반응성을 유지하고 싶다면
const { count, name } = toRefs(state)
count.value++ // state.count가 함께 변경됨
vue3에서는 반응형 데이터를 다루는 것이 중요하다. 그렇다면 반응형 데이터라는 게 뭘까?
vue에서는 데이터가 바뀌면 가상 DOM에서 먼저 변화를 감지하고 필요한 부분만 실제 DOM으로
렌더링을 한다. 이 때 데이터가 바뀌는 것을 감지하는 것. 이 때 쓰는 것이 반응형 데이터 도구들이다
만약에 vue에서 <script></script> 안에서 let num = 1이라 선언하고 num = 2라고 해도 이게 화면에서 바뀌지 않는다. 왜냐하면 vue에서는 이게 바뀌었다고 랜더링을 해야한다는 걸 감지 하지 못하기 때문이다.
그때 사용하는 것이 바로 ref, reactive, toRefs같은 친구들이다.
Ref
- 단일 값(primitive or Object)을 반응형으로 감싸는 객체이다.
- .value 속성을 통해 실제 값을 접근하거나 변경한다.
import { ref } from 'vue'
const count = ref(0)
console.log(count.value) // 0
count.value++
Reactive
- 객체(혹은 배열)를 깊은 반응형 객체로 변환
- .value가 필요 없음.
import { reactive } from 'vue'
const state = reactive({
count: 0,
user: {
name: '홍길동',
},
})
state.count++
객체 / 배열을 깊게 추적해서 속성이 바뀌면 뷰가 자동 갱신된다.
toRefs
- reactive 객체를 속성 단위 ref로 변환
- 주로 reactive 객체를 구조 분해 할당하려 할 때 사용
import { reactive, toRefs } from 'vue'
const state = reactive({
count: 0,
name: '홍길동',
})
const { count } = state // ❌ 이렇게 하면 반응성 X
// 구조 분해 할당 시 반응성을 유지하고 싶다면
const { count, name } = toRefs(state)
reactive 객체를 분해하면 반응성이 깨짐.
toRefs를 쓰면 각각의 ref처럼 만들어준다.