๐ŸŽจFrontEnd/Vue

vue 3 - computed (computed vs method)

IOTrue 2023. 7. 9. 23:56

๐Ÿ˜Ž vue 3 - computed (computed vs method) 

composition API๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค

โœ…  computed

vue์˜ ํ•จ์ˆ˜ํ˜• ์†์„ฑ์œผ๋กœ, ์–ด๋– ํ•œ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜์—ฌ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ์—ฐ๊ฒฐ๋œ data๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ฐ’์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์—ฌ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค
์ฆ‰, ์˜ต์ €๋ฒ„์˜ ์—ญํ• ์„ ํ•œ๋‹ค

๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค

<input :value="text" @input="event => text = event.target.value">
<div>sumC: {{ sumC }}</div>

const text = ref(1)
const sumC = computed(()=>{
    return text.value * 1
})

// sumC: 1

๊ธฐ๋ณธ์ ์œผ๋กœ getter๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ํ•„์š”์— ๋”ฐ๋ผ setter๋ฅผ ์„ค์ •ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
getter์™€ setter๋ฅผ ํ†ตํ•ด ์ฝ๊ธฐ, ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ setter๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š๊ณ  ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•  ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค

const firstName = ref('kim')
const lastName = ref('coding')

const fullName = computed({
  get() {
    return firstName.value + ' ' + lastName.value
  },
  set(newValue) {
    [firstName.value, lastName.value] = newValue.split(' ')
  }
})

fullName.value = "hello world" // firstName, lastName์ด ๋ณ€๊ฒฝ๋œ๋‹ค
console.log(fullName.value) // hello world

getter ์™€ setter ๋ฐฉ์‹์€ ์•„๋ž˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

<script setup>
import { ref, computed } from 'vue'

const firstName = ref('hello')
const lastName = ref('world')

const fullName = computed(()=>{
  return firstName.value + ' ' + lastName.value
})
firstName.value='kim'
lastName.value='coding'

console.log(fullName.value)
</script>

ref์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š”์ง€ computed์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š”์ง€์˜ ์ฐจ์ด์ด๋ฉฐ
getter์™€ setter๋ฅผ ์‚ฌ์šฉํ•ด์„œ computed๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ช…์‹œ์ ์ด๋ฉฐ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๊ธฐ์—

computed์˜ ๊ฐ’์„ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ๋• getter์™€ setter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ฐ”๋žŒ์งํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ๋ณธ๋‹ค

 

โœ…  method

์ผ๋ฐ˜ method๋ฅผ ์‚ฌ์šฉํ•ด๋„ computed์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค

<input :value="text" @input="event => text = event.target.value">
<div>sumM(): {{ sumM() }}</div>

const text = ref(1)
const sumM = ()=>{
    return text.value * 1
}

// sumM: 1

 

โœ…  computed vs method

 

๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๊ฒฐ๊ณผ ๊ฐ’์€ ๋™์ผํ•˜๊ณ  ์ฐจ์ด์ ์€ computed๋Š” ๋ฐ˜์‘ํ˜•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์บ์‹œ๋œ๋‹ค๋Š” ์ ์ด๋‹ค
์ฆ‰, computed๋Š” ์—ฐ๊ฒฐ๋œ ๊ฐ’(๋ฐ์ดํ„ฐ)์ด ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์—๋งŒ ์žฌํ‰๊ฐ€๋œ๋‹ค
์—ฐ๊ฒฐ๋œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์žฌ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ด์ „์— ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค

<input :value="text" @input="event => text = event.target.value">
<div>sumM(): {{ sumM() }}</div>
<div>sumC: {{ sumC }}</div>
<div>sumM(): {{ sumM() }}</div>
<div>sumC: {{ sumC }}</div>

const text = ref(1)

const sumC = computed(()=>{
  console.log("sumC")
  return text.value * 1
})

const sumM = ()=>{
  console.log("sumM")
  return text.value * 1
}

๊ฐ’์˜ ๋ณ€ํ™” ์—†์ด computed์™€ method๋ฅผ ๊ฐ 2๋ฒˆ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค

method๋Š” ๊ฐ’์ด ๊ฐ™์•„๋„ 2๋ฒˆ ํ˜ธ์ถœ์„ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•˜๊ณ ,
computed๋Š” 1๋ฒˆ ํ˜ธ์ถœ ํ›„ ๊ฐ’์ด ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „์— ์บ์‹ฑ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์„œ 1๋ฒˆ๋งŒ ํ˜ธ์ถœ๋๋‹ค

method๋Š” update ๋ผ์ดํ”„์‚ฌ์ดํด์ด ์ž‘๋™(๋ Œ๋”๋ง)ํ•œ๋‹ค๋ฉด ํ•จ์ˆ˜๋ฅผ ์žฌ์‹คํ–‰ํ•˜๊ณ 
computed๋Š” ์—ฐ๊ฒฐ๋œ ๊ฐ’์ด ๋ณ€๊ฒฝ ๋˜์–ด์•ผ๋งŒ ์žฌ์‹คํ–‰ํ•œ๋‹ค

 

๊ฒฐ๋ก 

์บ์‹ฑ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•ด๋„ ๋˜๋Š” ๋ณต์žกํ•œ ๋กœ์ง์˜ ๊ฒฝ์šฐ ํ•จ์ˆ˜๋ฅผ ๋งค๋ฒˆ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š”
์บ์‹ฑ๋œ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์ ์œผ๋กœ ๋” ํšจ์œจ์ ์ผ ๊ฒƒ์ด๋‹ค
์ฆ‰, ๋กœ์ง์ด ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ๋ถˆ๋Ÿฌ์˜ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ํฐ ๊ฒฝ์šฐ์—๋Š” computed๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์บ์‹ฑ์„ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ method๋ฅผ ์‚ฌ์šฉํ•˜์ž