vue 3 - computed (computed vs method)
๐ 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๋ฅผ ์ฌ์ฉํ์