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()
  }
}

ํ•˜์ง€๋งŒ ๋ฐ˜๋Œ€๋กœ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์€ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ํ•ญ์ƒ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰

์™œ ์ผ€์‹ฑ์ด ํ•„์š”ํ• ๊นŒ?

์บ์‹ฑ์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

  1. ๊ฑฐ๋Œ€ํ•œ ๋ฐฐ์—ด์„ ๋ฃจํ”„ ํ•˜๋ฉฐ ๋งŽ์€ ๊ณ„์‚ฐ์„ ํ•ด์•ผ ํ•˜๋Š” ๊ฐ’๋น„์‹ผ ๋น„์šฉ์˜ list ์†์„ฑ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.
  2. ๊ทธ๋ฆฌ๊ณ  list์— ์˜์กดํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๊ณ„์‚ฐ๋œ ์†์„ฑ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ
  3. ์บ์‹ฑ์ด ์—†๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” list์˜ getter๋ฅผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋งŽ์ด ์‹คํ–‰ํ•  ๊ฒƒ์ž„!
  4. ์บ์‹ฑ์„ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜๋ฉด๋จ

03. ๊ทธ๋Ÿฌ๋ฉด ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

  • ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ computed ์ด๋ฏ€๋กœ read only๋ผ๋Š”๊ฒƒ์„ ๋ช…์‹ฌํ•˜๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•จ
  • ๋น„๋™๊ธฐ ์š”์ฒญ์„ ํ•˜๊ฑฐ๋‚˜, DOM์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์ ˆ๋Œ€ ์•ˆ๋จ! -> side effect๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด ์•ˆ๋Œ
  • ํ•˜๊ณ ์‹ถ์œผ๋ฉด watch๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•จ

๋‹ค์Œ ํฌ์ŠคํŒ…์€ watch๊ฐ€ ๋ ๋“ฏ

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ