{
"name": "vue3-test",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"core-js": "^3.6.5",
"vue": "^3.0.0-0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"@vue/compiler-sfc": "^3.0.0-0",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^7.0.0-0"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/vue3-essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "babel-eslint"
},
"rules": {}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}
반응성(reactivity)이란 특정 데이터에 의존하는 계산 결과가 데이터가 변경 될 때 자동으로 업데이트된다는 것을 의미
기존에는Object.defineProperty()
를 활용하여 반응성을 구현하였습니다. get / set 을 활용하여 getter 함수와 setter 함수를 작성하여 구현하였습니다. 그러나 한계는 존재하였습니다. 속성을 추가하거나 삭제에 대해서는 동작하지 않았습니다.(이유는 단순합니다. Vue 인스턴스를 생성하여 초기화되는 과정에서 data 객체에 속성이 있어야 getter/setter 를 작성하기 때문입니다. -> 이미 만들어져서 초기화가 된 인스턴스에 속성을 추가하면 getter/setter 를 작성하지 않는겁니다. -> Vue.set() / this.$set() 을 통하여 이미 만들어진 인스턴스에 반응성 속성을 추가할 수 있긴 하다.)
const account = {
name: 'zero86',
money: 10
};
let money = account.money; // current money value
// money property 에 관련하여 get / set 속성에 접근할 함수 정의
Object.defineProperty(account, "money", {
get() {
return money
},
set(val) {
if (val <= 2) {
console.log("2 보다 작은값을 넣을수는 없습니다.");
} else {
money = val; // Normal setter behavior, this stores the new value
}
}
});
account.money = 0;
// Output: 2 보다 작은값을 넣을수는 없습니다.
account.money = 40; // money property 에 40이라는 값이 활당됩니다.
Vue3 에서는 ES6 proxy 를 활용하여 반응성을 구현했기때문에, 이제는 속성을 추가/삭제도 변경이 감지가 됩니다.
const account = {
name: "zero86",
money: 10
};
const accountProxy = new Proxy(account, {});
console.log(account.money); // 10
console.log(accountProxy.money); // 10
const accountProxy2 = new Proxy(account, {
get(target, key, receiver) {
console.log("Proxy getter called.." + key);
return target[key];
}
});
console.log(account.money); // 10
console.log(accountProxy.money); // Proxy getter called.. money / 10
Object.defineProperty()
get 과 비슷하게 동작하는거 같지만, 3개의 매개변수를 받습니다. target 은 account 객체와 동일한 객체입니다.