inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Vue3 완벽 마스터: 기초부터 실전까지 - "기본편"

Watch, WatchEffect

깊은 감시자 질문

88

cjkimhello97

작성한 질문수 10

0

<template>
  <div></div>
</template>

<script>
import { reactive, watch } from 'vue';

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

    watch(
      () => person.obj,
      (newValue, oldValue) => {
        console.log('newValue = ', newValue);
        console.log('oldValue = ', oldValue);
      },
    );

    return { person };
  },
};
</script>

<style lang="scss" scoped></style>

getter 형태로 watch 첫번째 인자를 넘겼기 때문에 개발자 도구에서 obj 의 count 프로퍼티를 증감했을 때에 감시에 걸리지 않아서 콘솔 출력이 되지 않는다는 것을 확인했습니다.

하지만 개발자 도구에서 obj 자체를 변경했을 때 감시에 걸려서 콘솔 출력이 될 것이라고 예상했지만 콘솔 출력이 되지 않았고 오히려 typeError 가 발생했습니다.

이유가 무엇인지 궁금합니다.

캡처.PNG.webp

 

vue.js

답변 2

0

짐코딩

안녀하세요 🙂
person.obj 자체를 개발자 도구에서 변경했을 때 TypeError가 발생하는 이유는

Vue3 reactive 시스템의 내부 구조 상 문제입니다.

reactive({ obj: { count: 0 } })에서 obj는 중첩된 reactive 객체가 됩니다. 개발자 도구에서 person.obj = newObject로 직접 할당하면:

  1. Vue의 Proxy 시스템을 우회하여 할당

  2. reactive 연결이 깨지면서 내부적으로 Proxy 처리 오류 발생

  3. watch의 newValue/oldValue 접근 시 TypeError 발생

올바른 방법은 Vue의 API를 통해 변경하는 것입니다

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

cjkimhello97님께서 직면한 문제는 Vue.js에서 객체의 구조 변경을 감지하는 데 관련된 자주 발생하는 이슈입니다. Vue.js의 watch는 객체의 프로퍼티 변경에 대해서는 기본적으로 깊은 감시(deep option)가 설정되지 않으면 감지하지 못할 수 있습니다.

해당 질문과 관련된 유사 케이스로는 다음 질문들이 있습니다:

  1. reactive로 선언한 반응형 객체 자체를 바꿨는데 watch 콜백함수가 실행이 안되요

    • 이 게시물에서는 reactive 객체의 구조가 변경될 때, 즉 객체 자체가 새로운 참조로 변경되는 경우 기존 watch가 감지하지 못하는 문제에 대해 다룹니다. 이는 Vue.js에서 객체의 참조가 변경될 때 일반적으로 감지하지 못하는 이유와 같습니다.
  2. watch강의 질문

    • 이 질문에서는 깊은 감시자 옵션을 잘못 설정하여 발생하는 문제를 설명합니다. watch 함수의 첫 번째 인자로 객체의 프로퍼티를 감시할 때 깊은 감시가 필요한 경우가 많습니다.

위의 링크들은 객체 내부의 속성 변화를 정확히 감지하고, 객체 자체의 참조 변경을 감시하기 위한 다양한 방법을 설명합니다. 이 문제는 deep: true 옵션을 watch 함수에 추가하여 해결할 수 있습니다. 예를 들어:

watch(
  () => person.obj,
  (newValue, oldValue) => {
    console.log('newValue = ', newValue);
    console.log('oldValue = ', oldValue);
  },
  { deep: true }
);

이렇게 하면 person.obj의 내부 구조가 변경될 때도 감지가 됩니다. Vue의 반응성 시스템에서 깊은 감시 기능을 적절히 활용하면 객체의 내부 프로퍼티 변경도 감지할 수 있어 유용합니다.

이미지를 통해 추가적인 오류 메시지가 발생할 수 있는 상황에 대한 힌트를 제공하려 했습니다. 개발자 도구에서 제공하는 오류 메시지를 통해서도 문제의 원인을 깊이 있게 파악하고 해결해 가는 과정을 겪어 보실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

npm init vue@3.1.9

0

36

2

크롭 웹스토어 vue devtools 설치 관련

0

38

1

snippets 작성하는 부분 설명이 있었나요?

0

47

2

computed 의 set 함수를 통해 const 변수에 값을 담는 부분

0

52

2

소스 공유 어디서 해야하는지 궁금합니다

0

60

2

component 등록과 사용

0

57

2

강의교안

0

56

2

eslint 룰 관련 질문이 있습니다.

0

63

2

npm init -y 명령어 실행에 관한 질문

0

153

2

volar 가 마켓플레이스에 검색되지 않아 vue(official)을 설치했습니다.

0

167

2

정리된 내용

0

153

2

화면이 왜 이렇게 뜨는걸까요?

0

184

2

왜 다르게 뜰까요..?ㅠㅠ

0

155

2

npm init vue , npm create vue@latest 명령 오류

0

289

2

강의를 듣다보니 궁금한 점 질문드립니다.

0

141

2

watch강의 질문

0

153

1

강의 듣다가 질문드립니다.

0

119

1

이벤트 처리 부분 강의 실습

0

140

2

v-pre는 설명이 없나요?

0

152

2

AppCard.vue 만들다 말고 오류가 갑자기 엄청 뜹니다

0

146

1

개발자도구 Vue 탭 관련 문의

0

240

2

강의를 인텔리제이로 수업따라가도 되져?

0

177

2

API 사용시 자동으로 import하는 기능은 어떤것을 설치해야 하나요?

3

274

2

이벤트 수식어 event 전달인자 관련 질문

0

136

1