현재 회사에서 vue.js를 사용하고 있습니다
그러나 아직도 vue를 미숙하게 다뤄서 생기는 문제들이 있어서 개념을 다시 공부하고 있습니다
이 글은 vue.js의 data 중 제가 미숙하게 이해한 부분이 있어서
미숙했던 개념과 문제를 겪었던 경험을 정리합니다
vue를 공부하려고 왔다면 공식문서를 추천드립니다
어떤 데이터가 있고, 이 데이터를 기반으로 화면을 렌더링합니다
이 때 이런 데이터를 상태
라고 합니다
상태가 변경되면, 화면도 함께 변경됩니다
React에서는 state이고, vue에서는 data입니다
vue api에는 접두사로 data는 data와 같습니다
<script>
export default {
data() {
return {
// 반응형이 주입된 데이터는 이곳에
count: 1,
};
},
created() {
console.log(this.count); // 1
console.log(this.$data); // { a: 1}
this.value = 10; // 반응형이 아닌 data
},
};
</script>
data()가 반환하는 객체에 포함된 변수는 반응형이 주입된 data
가 됩니다
이 data는 변경되면 화면을 다시 렌더링합니다
일부 data는 변경되더라도 렌더링 하지 않기를 원할수도 있습니다
그럴 땐 data()가 반환하는 객체에 포함을 안시키면 됩니다
vue는 this binding을 사용하므로 this에 새로운 내용을 추가하면 반응형이 아닌 data로 사용할 수 있습니다
this 바인딩을 사용하기 때문에 data()는 화살표 함수로 작성하면 안됩니다
당연하지만 반응형 data는 렌더링에 영향이 가니 필요할때만 변경되어야 합니다
그리고 제가 오늘 놓친 부분인데 vue 공식문서 중 proxy를 사용하니 조심하라는 내용이 있었습니다
export default {
data() {
return {
someObject: {}
}
},
mounted() {
const newObject = {}
this.someObject = newObject
console.log(newObject === this.someObject) // false
}
}
proxy는 객체를 재정의할 수 있는 기능입니다
내부적으로 반응형 data는 proxy를 사용하기 때문에 반응형 data에 저장된 값은 제가 생각한 값과 동일하지 않을 수 있습니다
제가 겪었던 대표적인 상황을 한가지 적겠습니다
<template>
<DxTreeView :onInitialized="onInitialized" />
</template>
<script>
export default {
components: {
DxTreeView,
},
data() {
return {
treeView: null,
};
},
methods: {
onInitialized(e) {
this.treeView = e.component;
},
},
};
</script>
devExtreme의 treeview를 사용한적이 있는데
tree의 node를 선택하거나, node를 열어야 할때 관련 메소드를 호출합니다
그러나 메소드가 잘 실행되었음에도 화면에 node들이 렌더링되지 않는 경우가 있었습니다
이미 treeview를 사용하셨던 분의 코드와 비교해보니
treeview instance를 반응형 data로 사용했냐 아니냐
가 유일한 차이점이었습니다
이 문제가 오늘 글을 쓴 이유이자 vue를 다시 공부하는 이유입니다
반응형 data에 vue instance를 저장했기 때문에 제가 생각한 vue instance와 동일한 값이 아니었습니다
정리
vue 내부적으로 반응형 data는 변경 시 리렌더링을 위해서 proxy를 사용한다
이로 인해 몇몇 경우 (대표적으로 vue instance) 내가 생각한 data가 아닐 수 있다
값이 바뀔 때 template이 다시 렌더링되어야 하는 경우에만 (필요한 경우에만) 반응형 데이터를 사용하도록 하자
참고
수정