Vue computed μμ± μ¬μ© μ μ£Όμν μ λ€
π‘ λ³Έ ν¬μ€νΈλ Vue.js μ½μ΄ ν μΌμμΈ Thorsten Lünborg μ΄ κΈ°κ³ ν κΈμ κ·Όκ±°ν©λλ€.
π computed μμ±μ΄λ?
export default {
name: "HelloWorld",
data() {
return {
todos: [
{ title: "wash dishes", done: true },
{ title: "remove trash", done: false },
],
};
},
computed: {
needTodos() {
return this.todos.filter((todo) => !todo.done);
},
},
};
Vue
μμ computed
μμ±μ data
μ λ³νλ₯Ό κ°μ§νμ¬
λμ μΌλ‘ κ³μ°λ κ°μ μ΄μ©ν λ μ¬μ©ν©λλ€.
λν watch
μμ±μ μ¬μ©νλ©΄ computed
κ° λ³ννλ κ²μ κ°μ§νμ¬
νΉμ ν¨μλ₯Ό μννλλ‘ ν μλ μμ΅λλ€.
π computed μμ±μ μ±λ₯μ μ΄μ μ?
μΊμ± (Caching)
computed
μμ±μ κ°μ₯ ν° μ₯μ μ μΊμ±μΈλ°, μμ‘΄νλ κ°μ λ³νκ° μλ€λ©΄
λ€μ κ³μ°νμ§ μκ³ μ΄μ κ°μ λ°νν©λλ€.
μ μμ μμλ todos
κ° λ³ννμ§ μλλ€λ©΄ μ무리 needTodos
λ₯Ό νΈμΆνλλΌλ
μ΄μ μ κ³μ°λμ΄ μΊμ±λ κ°μ λ°νν©λλ€.
μ§μ°λ νκ° (Lazy Evaluation)
computed
μμ±μ lazy
νκ² κ°μ κ³μ°ν΄μ λ°νν©λλ€.
μ¦, computed
μμ±μ΄ μ°Έμ‘°κ° λμμ λ (μ΄κΈ° νΉμ μμ‘΄νκ³ μλ κ°μ΄ λ³νν κ²½μ°) μ½λ°±μ΄ μνλ©λλ€.
λ°λΌμ λ§μ λ°μ΄ν°λ‘ λΉμ©μ΄ λ§μ΄ λλ μ°μ°μ μνν λ μ±λ₯μ μ΄μ μ΄ μμ΅λλ€.
π μ§μ°λ νκ°μ μ±λ₯ν₯μ μμ
<template>
<div>
<button type="button" @click="showList = !showList">show todos</button>
<template v-if="showList">
<template v-if="hasOpenedTodos">
<li v-for="(todo, idx) in needTodos" :key="idx">
{{ todo.title }}
</li>
</template>
<span v-else> nothing to show </span>
</template>
</div>
</template>
<script>
export default {
name: "HelloWorld",
data() {
return {
showList: false,
todos: [
{ title: "wash dishes", done: true },
{ title: "remove trash", done: false },
],
};
},
computed: {
needTodos() {
return this.todos.filter((todo) => !todo.done);
},
hasOpenedTodos() {
return this.needTodos.length > 0;
},
},
};
</script>
μ μμ μμ showList
κ° true
κ° λκΈ° μ κΉμ§ needTodos
λ μ°Έμ‘°λμ§ μκΈ° λλ¬Έμ
μμ‘΄νκ³ μλ todos
μ λ³νκ° μκΈ°λλΌλ κ°μ κ³μ°νμ§ μμ΅λλ€.
κ°λ¨ν μμ μ΄μ§λ§ λ§μ½ needTodos
μμ λΉμ©μ΄ ν° κ³μ°μ ν κ²½μ°μλ
μ§μ°λ νκ°λ‘ μΈν μ±λ₯ ν₯μμ κΈ°λν μλ μμ΅λλ€.
π μ§μ°λ νκ°κ° μ±λ₯μ νλ₯Ό λΆλ¬μ€λ κ²½μ°
λ°λλ‘ μ§μ°λ νκ°λ‘ μΈν΄ μ±λ₯μ νλ₯Ό μΌμΌν€λ κ²½μ°λ μμ΅λλ€.
computed
μμ±μ΄ ν΄λΉ κ°μ΄ μ°Έμ‘°λμμ λ κ³μ°μ μμνλ€λ κ²μ μ¬μ€
ν΄λΉ κ°μ΄ μ½νμ§ μμΌλ©΄ κ·Έμ κΉμ§ λ°μν μμ€ν μ΄ μ΄λ₯Ό μΈμ§νμ§ λͺ»νλ€λ κ²κ³Ό κ°μ΅λλ€.
κ·Έ λλ¬Έμ μμ‘΄νκ³ μλ κ°μ΄ λ³ννμ λ μ€μ λ‘ computed
μμ±μ΄ λ°ννλ κ°μ΄
λ€λ₯Έμ§λ μ½λ°±μ μννκΈ° μ κΉμ§ λͺ¨λ₯΄λ κ²μ λλ€.
μ΄κ² μ λ¬Έμ κ° λ κΉμ?
ν΄λΉ computed
μμ±μ μμ‘΄νκ³ μλ watch()
νΉμ λ€λ₯Έ computed
μμ±μ΄ μλ κ²½μ° λ¬Έμ κ° λ©λλ€.
κΈ°μ€μ΄ λλ computed μμ±μ΄ μ€μ λ‘ λ€λ₯Έ κ°μ λ°ννμ§ μλλΌλ
Vue λ νΉμ λͺ¨λ₯Ό μν©μ λλΉν΄
μ°κ΄λ λ€λ₯Έ λͺ¨λ μμ±λ€μ λν΄
μ
λ°μ΄νΈκ° νμνλ€λ νμ(dirty
)λ₯Ό λ¨κ²¨λμ΅λλ€.
μ΄ λλ¬Έμ λΆνμν μ¬μ°μ°μ΄ λ°μν μλ μλ κ²μ λλ€.
μμμ½λ
<template>
<div>
<button type="button" @click="increase">click me!</button>
<ul>
<li v-for="(item, idx) in someExpensiveLogic" :key="idx">
{{ item }}
</li>
</ul>
</div>
</template>
<script>
export default {
name: "HelloWorld",
data() {
return {
count: 0,
};
},
computed: {
isOver10() {
return this.count > 10;
},
someExpensiveLogic() {
/** κ³μ°νλλ° λ§μ λΉμ©μ΄ νμν computed λΌκ³ κ°μ ν©λλ€. */
return this.isOver10 ? [1, 2, 3] : [4, 5, 6];
},
},
methods: {
increase() {
this.count += 1;
},
},
updated() {
console.log("component updated");
},
};
</script>
μ μμ μμ λ²νΌμ 11λ² λλ₯ΌλκΉμ§ HelloWorld
μ»΄ν¬λνΈλ λͺλ²μ΄λ re-render
ν κΉμ?
μ λ΅μ 11λ² λͺ¨λ
μ
λλ€.
λ²νΌμ ν΄λ¦ν λλ§λ€ λ°μνλ κ³Όμ μ λ€μκ³Ό κ°μ΅λλ€.
- λ²νΌμ ν΄λ¦νμ λ
count
κ°μ΄ μ¦κ°ν©λλ€. isOver10
μcount
μ μμ‘΄νκ³ μκΈ° λλ¬Έμdirty
μ²λ¦¬λ©λλ€.someExpensiveLogic
λisOver10
μ μμ‘΄νκ³ μκΈ° λλ¬Έμdirty
μ²λ¦¬λ©λλ€.- μ»΄ν¬λνΈ ν
νλ¦Ώμ΄
someExpensiveLogic
λ₯Ό μ°Έμ‘°νκ³ μκΈ° λλ¬Έμdirty
μ²λ¦¬λ μμ±λ€μ μ¬μ°μ°μ΄ μνλ©λλ€.
νμ§λ§ λ°νλλ κ²°κ³Όκ°μ λͺ¨λ λμΌν©λλ€. - μ΄λ‘μΈν΄ μλ‘μ΄ κ°μ DOM κ³Ό template μ μ΄μ©ν΄μ
μ΄μ κ³Ό λμΌν νλ©΄μ 그리λ λΆνμν λ λλ§μ΄ λ°μν©λλ€.
μ΄ λ¬Έμ μ μμΈμ μμ½νλ©΄ λ€μκ³Ό κ°μ΅λλ€.
λμΌν κ°μ μμ£Ό λ°ννλ computed μμ±μ μ°Έμ‘°νκ³ μλ
μ°μ° λΉμ©μ΄ λΉμΌ λ€λ₯Έ computed μμ± νΉμ watcher κ° μκ³ template μ ν΅ν΄ μ°Έμ‘°λκ³ μλ€.
π μ΄λ¬ν κ²½μ° μ λ computed
μμ±μ μ¬μ©νλ©΄ μλλμ?
κ·Έλ λ€κ³ μ΄λ¬ν κ²½μ°λ₯Ό λͺ¨λ κ³ λ €ν΄μ computed
μμ± μ¬μ©μ νΌν νμλ μμ΅λλ€.
Vue
μ λ°μν μμ€ν
μ ν¨μ¨μ μΌλ‘ λμνλλ‘ μ΅μ νλμ΄μκΈ° λλ¬Έμ
λλΆλΆμ κ²½μ° μ΅μμ μ±λ₯μ 보μ₯ν©λλ€. (νΉν Vue 3
μμλ!)
μ€μν κ²μ computed
μμ±μ μ¬μ©ν λ μ΄λ¬ν νΉμ±μ΄ μλ€λ κ²μ μμλκ³
μ λ§ κ·λͺ¨κ° ν¬κ³ μ°μ° λΉμ©μ΄ ν° κ²½μ°μ λν΄ μ£Όμκ° νμνλ€λ κ²μ μΈμ§νλ κ²μ λλ€.
κ·ΈλμΌ νμμ λ°λΌ μ±λ₯ μ΅μ ν ν¬μΈνΈλ₯Ό μ‘μ μ μμν λκΉμ.
π μ°Έκ³ μλ£
'π archive' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Vue.js] $el μ΅μ μ 무μμΌκΉ? (0) | 2022.03.01 |
---|---|
[Vue.js] μμμ ν¨κ» 보λ λμ μ»΄ν¬λνΈ (0) | 2022.03.01 |
[Vue.js] Error Boundary λ‘ μλ¬ νΈλ€λ§νκΈ° (0) | 2022.02.20 |
[Vue.js] ν¨μν μ»΄ν¬λνΈ μ΄λͺ¨μ λͺ¨ (0) | 2022.02.20 |
[Vue.js] v-deep μμ±μ λν΄μ (0) | 2022.02.20 |
π¬ λκΈ