• 카테고리

    질문 & 답변
  • 세부 분야

    프론트엔드

  • 해결 여부

    해결됨

setup 함수내 문자열 관련 질문입니다.

23.01.13 15:34 작성 조회수 203

0

아래 코드를 실행하고

Add Message1 버튼을 4번 클릭하고 Add Message 버튼을 클릭하면 {{ normalMessage }} 값은 !가 4개 붙은 값이 나옵니다. 그리고 Add Message2 버튼을 클릭하면 콘솔창에는 !가 한개 붙은 값이 나옵니다.

normalMessage 가 addNormalMesssage 함수 안에서 선언한 지역 변수도 아닌데 왜 값의 공유가 안 되는 건가요?

<template>
  <h2>setup 함수내 반응형 메시지</h2>
  <p>{{ reactiveMessage }}</p>
  <button v-on:click="reactiveMessage += '!'">Add Message</button>

  <h2>setup 함수내 일반 메시지</h2>
  <p>{{ normalMessage }}</p>
  <button v-on:click="normalMessage += '!'">Add Message1</button>
  <button v-on:click="addNormalMesssage">Add Message2</button>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const reactiveMessage = ref('Hello Reactive Message');

    let normalMessage = 'Hello Normal Message';
    const addNormalMesssage = () => {
    normalMessage = normalMessage + '!';
    console.log(normalMessage);
    };

    return {
      reactiveMessage,
      normalMessage,
      addNormalMesssage,
    };
  },
};
</script>

답변 2

·

답변을 작성해보세요.

2

jjkim0222님의 프로필

jjkim0222

질문자

2023.01.14

let num = 5;
let test = function () {
  num++
  console.log(num);
};
// a.num이 가리키는 주소와 num이 가리키는 주소는 다름
let a = { num: num, test: test };
a.num++
a.num++
a.num++
console.log(a) // {num: 8, test: test()}
a.test() // 6
console.log(num) // 6

 

a = (function () {
  let normalMessage = 'Hello Normal Message';
  // 클로저
  const addNormalMesssage = () => {
    normalMessage = normalMessage + '!';
    console.log(normalMessage);
  };
  return {
    normalMessage,
    addNormalMesssage,
  };
})();

console.log(a) // {normalMessage : "Hello Normal Message" , addNormalMessage : ƒ }
// normalMessage 프로퍼티 값을 변경
a.normalMessage = a.normalMessage + '!'
a.normalMessage = a.normalMessage + '!'
a.normalMessage = a.normalMessage + '!'
a.normalMessage = a.normalMessage + '!'
console.log(a.normalMessage) // Hello Normal Message!!!!
a.addNormalMesssage() // Hello Normal Message!
console.log(a) // {normalMessage : "Hello Normal Message!!!!" , addNormalMessage : ƒ }



꼼꼼하시네요! 화이팅~!!

0

안녕하세요.

값이 반응형으로 동작하기 위해서는 반응형 API(ref, reactive 등)을 사용해야 합니다.

어떻게 보면 당연한 결과 입니다. 자바스크립트 문법 특성상 프리미티브 타입의 normalMessage는 값이 계속 더해지는 것처럼 보이지만 값을 할당할 때마다 매번 새로운 메모리로 값이 할당되기 때문입니다.

반응형으로 동작하기 위해서는 Composition API - 반응형 API를 사용해야 한다는 것에 초점을 두시면 될 것 같고요.

만약 원론적으로 조금 더 궁금하시다면 자바스크립트 Call By Reference vs Call By Value 와 같은 것을 생각해보시면 도움이 되실 것 같습니다.