๐ Vue.js Computed?
01. ์ ์ฌ์ฉํ ๊น?
- template ๋ด์ ํํ์์ ๋งค์ฐ ํธ๋ฆฌํ์ง๋ง, ๊ฐ๋จํ ํํ์์ ์ํ ๊ฒ์
- ๋๋ฌด ๋ง์ logic์ ๋ฃ์ผ๋ฉด ์ ์ง๊ด๋ฆฌ๊ฐ ์ด๋ ค์ธ ์ ๋ ์์
export default {
data() {
return {
author: {
name: "John Doe",
books: [
"Vue 2 - Advanced Guide",
"Vue 3 - Basic Guide",
"Vue 4 - The Mystery",
],
},
};
},
};
๊ทธ๋ฆฌ๊ณ ์ด์ํ์์ author
๊ฐ ์ด๋ฏธ ์ฑ
์ ๊ฐ์ง๊ณ ์๋์ง์ ๋ฐ๋ผ msg๋ฅผ ํํํ๊ณ ์ถ๋ค๋ฉด
<template>
<p>์ฑ
์ ๊ฐ์ง๊ณ ์๋ค:</p>
<span></span>
</template>
- ๋ฒ์จ template๊ฐ ๋ณต์กํด์ง๋๊ฒ์ด ๋๊ปด์ง
- ํ์ง๋ง ๋ ํฐ ๋ฌธ์ ๋ ๋ฐ์ํ ๊ฒฐ๊ณผ๊ฐ
author.books
์ ์ํด ๊ณ์ฐ๋๋ค๋ ์ ๋ณด๋ค, template ๋ด๋ถ์์ ์ฝ๋๊ฐ ๋ฐ๋ณต๋์์ ๊ฒฝ์ฐ์ - ๋ฐ๋ผ์ ๋ฐ์ํ ๋ฐ์ดํฐ๋ฅผ ํํจํ ๋ณต์กํ logic์ ๊ฒฝ์ฐ,
computed
๋ฅผ ์ฌ์ฉํ๋๊ฒ ์ข์
๊ฐ์ ๋ ๊ฒฝ์ฐ
export default {
data() {
return {
author: {
name: "John Doe",
books: [
"Vue 2 - Advanced Guide",
"Vue 3 - Basic Guide",
"Vue 4 - The Mystery",
],
},
};
},
computed: {
// ๊ณ์ฐ๋ ๊ฐ์ ๋ฐํํ๋ ์์ฑ
publishedBooksMessage() {
// `this`๋ ์ปดํฌ๋ํธ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
return this.author.books.length > 0 ? "Yes" : "No";
},
},
};
<p>์ฑ
์ ๊ฐ์ง๊ณ ์๋ค:</p>
<span></span>
- computed๋ก
publishedBookMessage
๋ฅผ ์ ์ธํจ -
data
์ ์๋books
๋ฐฐ์ด์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด, ๊ทธ์๋ค๋ผpublishedBookMessage
๊ฐ ๋ฐ๋ - ์ผ๋ฐ ์์ฑ์ฒ๋ผ template์
computed
์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉํ ์ ์์ - Vue๋
publishedBooksMessage
์ ๊ฐ์ดauthor.books
์ ์์กดํ๋ค๋ ๊ฒ์ ์๊ณ ์์ผ๋ฏ๋ก,author.books
๊ฐ ๋ณ๊ฒฝ๋๋ฉดpublishedBooksMessage
๋ฅผ ๋ฐ์ธ๋ฉํด ์์กดํ๋ ๋ชจ๋ ๊ฒ์ ์ ๋ฐ์ดํธํจ
02. computed vs method
methods
๋ฅผ ์ฌ์ฉํด์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์
<template>
<p></p>
</template>
// ์ปดํฌ๋ํธ ๋ด์์
methods: {
calculateBooksMessage() {
return this.author.books.length > 0 ? 'Yes' : 'No'
}
}
computed
๋์methods
๋ฅผ ์ฌ์ฉํด์ ๋์ผํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ ์ํ ์ ์์- ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ ์ ๊ทผ ๋ฐฉ์์ ์ค์ง์ ์ผ๋ก ์์ ํ ๋์ผํจ
- ๊ทธ๋ฌ๋
computed
๋ ์์กดํ๋ ๋ฐ์ํ์ ๊ธฐ๋ฐ์ผ๋ก caching ํ๋ค๋ ๊ฒ์
computed ์์ฑ์ ์์กดํ ๋ฐ์ํ ์ค ์ผ๋ถ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ๋ค์ ํ๊ฐ๋จ
์ฆ,author.books
๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ํ, ์ฌ๋ฌ๊ณณ์์publishedBooksMessage
๋ฅผ ์ ๊ทผํ๋ค๋ฉด,
getter ํจ์๋ฅผ ๋ค์ ์คํ์ํค์ง ์๊ณ ์ด์ ์ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฆ์ ๋ฐํํจ
- ๋ฐ๋ผ์ Date.now()๊ฐ ๋ฐ์ํ์ผ๋ก์จ ์์กด๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ดํ ๊ณ์ฐ๋ ์์ฑ์ด ์ ๋ฐ์ดํธ๋์ง ์์
computed: {
now() {
return Date.now()
}
}
ํ์ง๋ง ๋ฐ๋๋ก ๋ฉ์๋ ํธ์ถ์ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ ๋๋ง๋ค ํญ์ ํจ์๋ฅผ ์คํ
์ ์ผ์ฑ์ด ํ์ํ ๊น?
์บ์ฑ์ด ํ์ํ ์ด์ ๋ ๋ฌด์์ผ๊น?
- ๊ฑฐ๋ํ ๋ฐฐ์ด์ ๋ฃจํ ํ๋ฉฐ ๋ง์ ๊ณ์ฐ์ ํด์ผ ํ๋ ๊ฐ๋น์ผ ๋น์ฉ์ list ์์ฑ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
- ๊ทธ๋ฆฌ๊ณ list์ ์์กดํ๋ ๋ ๋ค๋ฅธ ๊ณ์ฐ๋ ์์ฑ์ด ์์ ์ ์์
- ์บ์ฑ์ด ์๋ค๋ฉด ์ฐ๋ฆฌ๋ list์ getter๋ฅผ ๋ถํ์ํ๊ฒ ๋ง์ด ์คํํ ๊ฒ์!
- ์บ์ฑ์ ์ํ์ง ์๋ ๊ฒฝ์ฐ์๋ง ๋ฉ์๋ ํธ์ถ์ ์ฌ์ฉํ๋ฉด๋จ
03. ๊ทธ๋ฌ๋ฉด ์ธ์ ์ฌ์ฉํด์ผ ํ ๊น?
- ์ด๋ฆ ๊ทธ๋๋ก
computed
์ด๋ฏ๋ก read only๋ผ๋๊ฒ์ ๋ช ์ฌํ๊ณ ์ฌ์ฉํด์ผ ํจ - ๋น๋๊ธฐ ์์ฒญ์ ํ๊ฑฐ๋, DOM์ ๋ณ๊ฒฝํ๋ฉด ์ ๋ ์๋จ! -> side effect๊ฐ ๋ํ๋๋ฉด ์๋
- ํ๊ณ ์ถ์ผ๋ฉด watch๋ฅผ ์ฌ์ฉํด์ผํจ
๋ค์ ํฌ์คํ ์ watch๊ฐ ๋ ๋ฏ
๋๊ธ๋จ๊ธฐ๊ธฐ