웹 개발/Vue

[Vue3] ref(), reactive()

cha430 2025. 5. 15. 11:08

 

 

✅ ref() vs reactive() 차이

구분 ref() reactive()
대상 기본형(숫자, 문자열 등) 또는 객체 객체만
값 접근 .value 필요 (기본형인 경우) 바로 접근 가능
구조 분해 (destructuring) 반응성 유지 안 됨 반응성 유지 안 됨
사용 예 간단한 상태값 (숫자, 문자열, boolean 등) 여러 속성을 가진 객체

 

 

 

- ref() 예제

 : 기본형 변수에 적합

import { ref } from 'vue';

export default {
  setup() {
    const count = ref(0);

    function increment() {
      count.value++;
    }

    return { count, increment };
  }
}

 

 

  • ref(0) → 내부적으로 value 속성에 값을 담음
  • 화면에서 {{ count }}로 사용 가능 (템플릿에서는 .value 없이 접근 가능)
  • 함수 내부에서는 count.value로 접근해야 함

 

 


 

 

 

- reactive() 예제

 : 객체 상태관리에 적합

 

import { reactive } from 'vue';

export default {
  setup() {
    const state = reactive({
      count: 0,
      name: '홍길동'
    });

    function increment() {
      state.count++;
    }

    return { state, increment };
  }
}

 

 

  • reactive()는 객체 전체를 감싸 반응형으로 만듦
  • state.count, state.name처럼 바로 접근 가능
  • .value 필요 없음

 

또한 counter.counter 처럼 반응형 객체의 이름과 내부 변수 이름을 같은  이름으로 줘도 가능

<template>
  <button type="button" @click="setCount(7)"> Set 7 </button>
  <p>Counter is : {{ counter.counter }} </p>
</template>

<script setup>
import { reactive } from 'vue'

// 반응형 객체
const counter = reactive({
  counter: 0
})

// 값 변경 함수
function setCount(val) {
  counter.counter = val   ✅ 올바른 접근
}
</script>

 

 

 

 

**

 

구조 분해(destructuring)하게 되면 reactive()  반응성이 깨질 수 있으므로 주의

const { count } = reactive({ count: 0 });

 

 

이런식으로 하면 count 는 반응형이 아니다.

 

구조분해 : 객체에서 값을 꺼내 변수에 바로 담는 문법으로 {}를 쓴다.

const person = {
  name: '철수',
  age: 20
};

// 구조 분해!
const { name, age } = person;

console.log(name); // 철수
console.log(age);  // 20

 

만약 아래처럼 쓰면 구조분해 아님. 그냥 state 객체를 count 변수에 넣은 것

const count = state;
import { reactive } from 'vue';

const state = reactive({ count: 0, name: 'a' });  // ← name='a'를 name: 'a'로 수정
const count = state;
console.log(state);

출력 : {count: 0,  name: "a"}

'웹 개발 > Vue' 카테고리의 다른 글

[Vue3] 데이터 등록 예제  (0) 2025.05.15
[Vue3 comp] input, 숫자 증감 예제  (0) 2025.05.15
[Vue3] npm run dev 실행되지 않을 때  (0) 2025.05.15
[Vue3] v- 지시자 directive  (0) 2025.05.15
[Vue3] LifeCycle hook, mount  (0) 2025.05.14