1. Computed 란?
- computed는 script 태그에서 사용할 수 있는 속성 중 하나다.
- computed에 등록된 어떤 변수나 조건, 메소드 등은 계속해서 감시 및 추적된다.
- computed를 통해 특정 값을 감시하고, 해당 값의 변화에 따라 웹 페이지 또는 컴포넌트가 알맞게 반응하도록 설정할 수 있다.
- computed는 기존의 어떤 데이터 값을 후처리하여 사용하고 싶을 때 이용하는 기능이다.
2. 예제코드 및 경로
a) 파일 경로
b) App.vue
<template>
<section>
<h1>Fruits</h1>
<ul>
<li
v-for="fruit in fruits"
:key="fruit">
{{ fruit }}
</li>
</ul>
</section>
</template>
<script>
export default {
data() {
return {
fruits: [
'Apple', 'Banana', 'Cherry'
]
}
}
}
</script>
<style lang="scss">
</style>
c) Fruits.vue
<template>
<section v-if="hasFruit">
<h1>Fruits</h1>
<ul>
<li
v-for="fruit in fruits"
:key="fruit">
{{ fruit }}
</li>
</ul>
</section>
</template>
<script>
export default {
data() {
return {
fruits: [
'Apple', 'Banana', 'Cherry'
]
}
},
computed: {
hasFruit() {
return this.fruits.length > 0
}
}
}
</script>
<style lang="scss">
h1, li {
font-size: 50px;
}
</style>
d) 코드 해설
- computed라는 속성값을 통해서 hasFruit() 메소드를 등록한다.
- section 태그에서 v-if를 사용하여 조건에 hasFruit()를 명시한다.
- data에 등록되어 있는 fruits 배열에 값의 존재여부에 따라 출력을 할것인지 말것인지를 결정하게 된다.
3. 차이점
- computed를 사용했을 때와 사용하지 않았을 때의 차이점이 무엇일까?
a) computed 없이 배열에 값이 없는 경우
<template>
<section>
<h1>Fruits</h1>
<ul>
<li
v-for="fruit in fruits"
:key="fruit">
{{ fruit }}
</li>
</ul>
</section>
</template>
<script>
export default {
data() {
return {
fruits: [
// 'Apple', 'Banana', 'Cherry'
]
}
},
// computed: {
// hasFruit() {
// return this.fruits.length > 0
// }
// }
}
</script>
<style lang="scss">
h1, li {
font-size: 50px;
}
</style>
b) computed 사용시 배열에 값이 없는 경우
<template>
<section v-if="hasFruit">
<h1>Fruits</h1>
<ul>
<li
v-for="fruit in fruits"
:key="fruit">
{{ fruit }}
</li>
</ul>
</section>
</template>
<script>
export default {
data() {
return {
fruits: [
// 'Apple', 'Banana', 'Cherry'
]
}
},
computed: {
hasFruit() {
return this.fruits.length > 0
}
}
}
</script>
<style lang="scss">
h1, li {
font-size: 50px;
}
</style>
c) 결론
- computed를 사용하면 특정 값의 변화에 따라 웹페이지의 반응을 유도할 수 있다.
- 다시 말해, 어떤 값을 기준으로 페이지 또는 컴포넌트를 새롭게 연산 및 출력하도록 설정할 수 있는 것이다.
4. computed의 동작원리(feat. 캐싱)
<template>
<h1>{{ reverseMessage() }}</h1>
<h1>{{ reverseMessage() }}</h1>
<h1>{{ reverseMessage() }}</h1>
<h1>{{ reverseMessage() }}</h1>
</template>
<script>
export default {
data() {
return {
msg: "Hello Computed!"
}
},
methods: {
reverseMessage() {
return this.msg.split('').reverse().join('')
}
}
}
</script>
<style>
h1{
font-size: 50px;
}
</style>
- 위의 코드는 reverseMessage()라는 메소드를 4번 반복하여 실행되는 구조를 갖고있다.
- 4번 정도면 CPU가 충분히 소화할 수 있는 횟수이지만, 백번 또는 천번 또는 만번 반복된다고 가정하면 웹페이지의 로딩속도가 느려질 수 밖에 없는 작업이다.
- 이러한 부분을 다음과 같이 computed 속성을 사용하여 최적화 할 수 있다.
<template>
<h1>{{ computedMessage }}</h1>
<h1>{{ computedMessage }}</h1>
<h1>{{ computedMessage }}</h1>
<h1>{{ computedMessage }}</h1>
</template>
<script>
export default {
data() {
return {
msg: "Hello Computed!"
}
},
computed: {
// computed는 연산된 data를 관리하는 공간이다.
// 아래의 computedMessage()는 메소드처럼 선언되었지만
// data처럼 명시 및 사용됨을 기억하자.
computedMessage() {
return this.msg.split('').reverse().join('')
}
},
methods: {
reverseMessage() {
return this.msg.split('').reverse().join('')
}
}
}
</script>
<style>
h1{
font-size: 50px;
}
</style>
a) computed는 어떻게 동작 하는가? (최적화가 가능한 이유)
- computed는 캐시를 사용하여 연산된 값을 저장한다. 이 과정을 캐싱이라고 한다.
- 캐시란, 자주 사용하는 값을 복사해서 저장하는 임시공간이다.
- 반복되는 메소드 호출이 있더라도, 해당 메소드가 computed 속성에 등록되어 있다면 최초에 연산된 값을 캐시에 저장하고 이를 불러와서 사용하는 방식으로 작동한다.
'Front-end > Vue3' 카테고리의 다른 글
11. Vue - watch 속성 (0) | 2021.05.18 |
---|---|
10. Vue - Getter & Setter (0) | 2021.05.18 |
8. Vue - 템플릿 문법 (0) | 2021.05.17 |
7. Vue - 인스턴스와 라이프사이클 (0) | 2021.05.14 |
6. Vue - 기초문법 (0) | 2021.05.13 |
댓글