let message = "hello!";
let longMsg = message + "ok!";
console.log(longMsg); // hello!ok!
message = "hi!";
console.log(longMsg); // hello!ok! => 변경되지 않음..ㅜㅜ
// js는 반응형이 아니기 때문에 앞서 작성한 연산이 실행되지 않음.
const data = {
message: "hello",
longMessage: "hello world",
};
const handler = {
// 프록시가 지원하는 일명 트랩을 설정할 수 있다.
set(target, key, value) {
// set() 자동으로 인수를 받음. 이 setter함수는 proxy에 새로운 프로퍼티가 설정될 때마다 트리거된다.
// target: 래핑된 값, key: 프로퍼티 이름, value: 프로퍼티 값
console.log(target); // {message: 'hello'} => 원본값
console.log(key); // message
console.log(value); // Hello => 원본 값이 변경되지는 않음.
if (key === "message") {
target.longMessage = value + " world!";
}
target.message = value; // 원본값 변경
},
};
const proxy = new proxy(data, handler);
// data가 proxy에 래핑되기 때문에 data의 massage를 엑세스할 수 있다.
prosy.message = "Hello"; // 새로운 프로퍼티 설정으로 setter함수 트리거 됨!
console.log(proxy.longMessage); // "Hello world"
👉🏻 이러한 반응형 작업을 Vue가 내부적으로 한다. 모든 data프로퍼티를 추적하고 프로퍼티에 변경 사항이 발생하면 앱에서 해당 프로퍼티가 사용된 부분을 업데이트한다❗️❗️
template
라고 한다.const app2 = Vue.createApp({
template: `
<p>{{ favMeal }}</p>
`,
data() {
return {
favMeal: "meal",
};
},
});
app2.mount("#app2");
input, p, section, h, textarea 등 필요할 때만 값을 가져오기 위해 사용
vue는 ref를 감지하여 내부에 이를 저장한다.
vue가 지원하는 프로퍼티는 refs를 사용한다.
$refs`는 키-값쌍으로 이루어져 있어 템플릿에 지정한 ref값을 사용하여 요소의 값(요소자체)을 가져온다.
index.html
<section id="app">
<h2>How Vue Works</h2>
<input type="text" ref="userText" />
<button @click="setText">Set Text</button>
<p>{{ message }}</p>
</section>
const app = Vue.createApp({
data() {
return {
message: "Vue is great!",
};
},
methods: {
setText() {
this.message = this.currentUserInput;
this.message = this.$refs.userText.value;
console.log(this.$refs.userText); // <input type="text" />
console.dir(this.$refs.userText); // dir => 해당 요소객체의 프로퍼티를 확인할 수 있다.
},
},
});
beforeCreate()
: 앱이 완전 초기화되기 이전에 호출created()
: 초기화가 완료되고 아직 마운트가 되기 전 상태, 이 시점까지는 화면에 표시되는 것이 아무것도 없다.beforeMount()
: vue가 화면에 무언가 표시하기 직전(마운트 되기 직전) 단계로 화면을 통해 볼 수 있게 되기 바로 직전 단계입니다.mounted()
: 마운트된 이후 단계로 화면에 뭔가 나타난다. 이제 vue앱이 초기화되고 템플릿도 컴파일을 마쳤기 때문에 화면에 표시되는 출력값이 생긴다. vue가 화면에 표시할 대상을 인지하고 브라우저에 지시 사항을 넘겨서 브라우저가 이에 따라 vue 앱이 정의한 대로 모든 콘텐츠가 있는 HTML요소를 추가한다. 이것으로 마운트된 vue앱(인스턴스)가 완성된다.beforeUpdate()
: 뷰 앱내에서 업데이트를 완전히 처리하지 않았을 때에 대한 단계updated()
: 해당 처리(업데이트)가 완료되었을 때에 대한 단계, 다시 mounted단계를 거칠 필요가 없다.beforeUnmount()
: 콘텐츠(뷰앱) 삭제 직전에 실행되는 단계, 콘텐츠(뷰앱)가 삭제 되기 전 상태unmounted()
: 콘텐츠(뷰앱) 삭제 후 실행되는 단계, 콘텐츠(뷰앱)가 삭제 되고 난 뒤 상태