[Vue.js] λ°μμ±(Reactivity) μμ€ν
1. Vueμ λ°μμ± μμ€ν μ΄λ?
κ°λ¨νκ² λ§μλ리μλ©΄, λ°μ΄ν° μνκ° λ³νλ©΄ μλμΌλ‘ μ¬μ©μ μΈν°νμ΄μ€(UI)μ λ°μλλλ‘ νλ μμ€ν μ λ§ν©λλ€.
Vueμ λ°μμ± μμ€ν μ μ΅μ λ² ν¨ν΄(Observer Pattern)μ κΈ°λ°μ λκ³ μμ΅λλ€.
μ΅μ λ² ν¨ν΄μ΄λ ?
λμμΈ ν¨ν΄(Design Pattern)μ€ νλλ‘, κ°μ²΄ κ° 1 λ N κ΄κ³λ₯Ό μ μνμ¬, ν κ°μ²΄μ μνκ° λ³κ²½λμμ λ
μμ‘΄μ±μ κ°μ§ λ€λ₯Έ κ°μ²΄λ€μκ² μλμΌλ‘ μλ¦Όμ μ λ¬νλ ꡬ쑰μ λλ€.
μ¦, κ°μ²΄μ μνκ° λ³κ²½μ΄ λλ©΄ μμ‘΄μ±μ κ°μ§ λ€λ₯Έ κ°μ²΄λ€μ μνλ κ°μ΄ λ³κ²½μ μν¬ μ μλ€λ λ»μ λλ€.
Vueλ λ°μ΄ν°λ₯Ό μΆμ νκ³ λ°μ΄ν° λ³κ²½ μ¬νμ΄ κ°μ§λλ©΄ μ΄λ₯Ό λ λλ§ μμ€ν (Renderer)μ μ λ¬ν΄ UIλ₯Ό μλμΌλ‘ μ λ°μ΄νΈλ₯Ό νκ² λλλ°, μ΄ κ³Όμ μ ν¬κ² λ λ¨κ³λ‘ μ΄λ£¨μ΄μ§λλ€:
- λ°μ΄ν° μΆμ
- Vueλ λ°μ΄ν°μ μνλ₯Ό μΆμ νμ¬, λ³κ²½ μ¬νμ κ°μ§νκ³ , μ΄λ₯Ό ν΅ν΄ λ°μ΄ν°μ UI μ¬μ΄μ κ΄κ³λ₯Ό μ μ§ν©λλ€.
- UI μ
λ°μ΄νΈ
- λ°μ΄ν°κ° λ³κ²½λλ©΄, Vueλ λ³κ²½λ λ°μ΄ν°μ μ°κ²°λ UIλ₯Ό λ€μ λ λλ§νμ¬ μ¬μ©μμκ² μ΅μ μνλ₯Ό 보μ¬μ€λλ€.
2. Vue 3μμ λ°μμ±μ ꡬννλ λ°©λ²
Vue 3μμλ Composition APIλ₯Ό λμ νμ¬ λμ± μΈλ°νκ³ μ μ°νκ² λ°μμ±μ ꡬνν μ μμ΅λλ€.
μ£Όμ κΈ°λ₯μΈ refμ reactiveλ₯Ό μ€μ¬μΌλ‘ 보λλ‘ νκ² μ΅λλ€.
2-1. ref
refλ κΈ°λ³Έ λ°μ΄ν° νμ (μ«μ, λ¬Έμμ΄ λ±)μ λ°μν λ°μ΄ν°λ‘ λ§λ€ λ μ¬μ©λ©λλ€.
<template>
<p>Count: {{ count }}</p>
<button @click="increment">Increment</button>
</template>
<script setup>
import { ref } from 'vue'
const count = ref(0)
const increment = () => {
count.value++
}
</script>
μ°μ refλ‘ μμ±ν κ°μ .valueλ‘ μ κ·Όν΄μΌ ν©λλ€.
κ°μ²΄μλ refλ₯Ό μ¬μ©ν μ μμ§λ§, κ°μ²΄ μ 체λ₯Ό κ΅μ²΄ν μΌμ΄ μλ€λ©΄ reactiveλ₯Ό μ¬μ©νλκ² λ μ ν©ν©λλ€.
2-2. reactive
reactiveλ κ°μ²΄(Object)μ λ°°μ΄(Array)λ₯Ό λ°μνμΌλ‘ λ§λ€ λ μ¬μ©λ©λλ€.
<template>
<div>
<p>Name: {{ user.name }}</p>
<p>Age: {{ user.age }}</p>
<button @click="updateName('Jane Doe')">Change Name</button>
</div>
</template>
<script setup>
import { reactive } from 'vue'
const user = reactive({
name: 'John Doe',
age: 30,
})
const updateName = (newName) => {
user.name = newName
}
</script>
reactiveλ₯Ό μ¬μ©νκ² λλ©΄ κ°μ²΄ λ΄λΆμ λͺ¨λ μμ±μ΄ λ°μνμΌλ‘ μ€μ λλ©°, κΈ°μ‘΄ μμ±μ μ λ°μ΄νΈνλ©΄ Vueκ° μ΄λ₯Ό κ°μ§ν΄
UIλ₯Ό μ λ°μ΄νΈλ₯Ό ν©λλ€.
μμ refμμ μΈκΈνλ―μ΄, κ°μ²΄ μ 체λ₯Ό κ΅μ²΄ν μΌμ΄ μλ€λ©΄ reactiveλ₯Ό μ¬μ©νλκ² λ μ ν©νκΈ΄ νμ§λ§,
κ°μ²΄μλ refλ₯Ό μ¬μ©νλ μμλ₯Ό 보μ¬λ리면 λ€μκ³Ό κ°μ΅λλ€.
<template>
<div>
<p>Name: {{ user.name }}</p>
<p>Age: {{ user.age }}</p>
<button @click="updateName('Jane Doe')">Change Name</button>
</div>
</template>
<script setup>
import { ref } from 'vue'
const user = ref({})
user.value = {
name: 'John Doe',
age: 30,
}
const updateName = (newName) => {
user.value.name = newName
}
</script>
refλ₯Ό μ¬μ©νκ²λλ©΄ .valueλ‘ μ κ·Όν΄μΌνλλ° κ°μ²΄λ λ§μ°¬κ°μ§μ λλ€.
μμ κ°μ΄ refλ‘ μ μΈν κ°μ²΄λ user.valueλ‘ μ κ·Όνλ©°, nameμμ±μ κ°λ₯΄ν¬ λλ user.value.nameμΌλ‘ λ€μ΄κ°μΌν©λλ€.