-
[Vue.js] λ°μμ±(Reactivity) μμ€ν π Vue.js 2024. 12. 4. 15:32
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μΌλ‘ λ€μ΄κ°μΌν©λλ€.
'π Vue.js' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Vue.js] λΌμ΄νμ¬μ΄ν΄ ν (Lifecycle Hooks) (0) 2025.04.16 [Vue.js] Propsμ Emits (1) 2024.12.05 [Vue.js] ν νλ¦Ώ λ¬Έλ² λ° λ°μ΄ν° λ°μΈλ© (4) 2024.12.02 [Vue.js] μ»΄ν¬λνΈ κ°λ λ° μ¬μ©λ² (2) 2024.10.16 [Vue.js] Vue νλ‘μ νΈ κ΅¬μ‘° μ΄ν΄νκΈ° (2) 2024.09.24 - λ°μ΄ν° μΆμ