λ€μ΄κ°λ©°
Vue 3μ Composition APIλ₯Ό μ¬μ©νλ€ λ³΄λ©΄ λ°μν λ°μ΄ν°λ₯Ό λ§λλ λ°©λ²μ΄ μ¬λ¬ κ°μ§λΌ ν·κ°λ¦΄ λκ° μμ΅λλ€. ref, shallowRef, reactive, shallowReactiveβ¦ μ΄λ¦μ λΉμ·νλ° λμμ λ―Έλ¬νκ² λ€λ¦
λλ€.
μ΄ κΈμμλ λ€ κ°μ§ APIμ μ°¨μ΄λ₯Ό μ½λμ ν¨κ» μ 리ν΄λ³΄κ² μ΅λλ€.
ref vs reactive
κ°μ₯ κΈ°λ³Έμ μΈ λ κ°μ§λΆν° λΉκ΅ν΄λ΄ μλ€.
ref
refλ μ΄λ€ νμ
μ κ°μ΄λ λ°μνμΌλ‘ λ§λ€ μ μμ΅λλ€. μμκ°(string, number, boolean)μ λ¬Όλ‘ κ°μ²΄λ κ°λ₯ν©λλ€.
<script setup>
import { ref } from "vue";
const count = ref(0);
const user = ref({ name: "Kwan", age: 30 });
// .valueλ‘ μ κ·Ό
count.value++;
user.value.name = "Lee"; // κΉμ μμ± λ³κ²½λ λ°μνμΌλ‘ κ°μ§
</script>
refλ .valueλ‘ κ°μΈμ§ κ°μ²΄λ₯Ό λ°νν©λλ€. κ°μ μ κ·Όνκ±°λ λ³κ²½ν λ νμ .valueλ₯Ό κ±°μ³μΌ ν©λλ€. λ¨, ν
νλ¦Ώμμλ μλμΌλ‘ μΈλνλμ΄ .value μμ΄ μ¬μ©ν μ μμ΅λλ€.
κ°μ²΄λ₯Ό refμ λ£μΌλ©΄ λ΄λΆμ μΌλ‘ reactiveλ₯Ό μ¬μ©νμ¬ κΉμ(deep) λ°μνμ΄ μ μ©λ©λλ€. μ€μ²©λ μμ±μ λ³κ²½ν΄λ κ°μ§λ©λλ€.
reactive
reactiveλ κ°μ²΄ νμ
(Object, Array, Map, Set λ±) λ§ λ°μνμΌλ‘ λ§λ€ μ μμ΅λλ€. μμκ°μ μ¬μ©ν μ μμ΅λλ€.
<script setup>
import { reactive } from "vue";
const user = reactive({ name: "Kwan", age: 30 });
// .value μμ΄ μ§μ μ κ·Ό
user.name = "Lee"; // λ°μνμΌλ‘ κ°μ§
</script>
.value μμ΄ μ§μ μμ±μ μ κ·Όν μ μλ€λ μ μ΄ νΈλ¦¬νμ§λ§, λͺ κ°μ§ μ μ½μ΄ μμ΅λλ€.
// 1. μμκ° μ¬μ© λΆκ°
const count = reactive(0); // λμνμ§ μμ
// 2. ꡬ쑰λΆν΄νλ©΄ λ°μμ±μ μμ
const { name, age } = reactive({ name: "Kwan", age: 30 });
// name, ageλ λ μ΄μ λ°μνμ΄ μλ
// 3. μ¬ν λΉνλ©΄ λ°μμ±μ μμ
let user = reactive({ name: "Kwan" });
user = reactive({ name: "Lee" }); // κΈ°μ‘΄ μ°Έμ‘°μ μ°κ²° λκΉ
μ 리
| κ΅¬λΆ | ref | reactive |
|---|---|---|
| μ¬μ© κ°λ₯ν νμ | λͺ¨λ νμ | κ°μ²΄ νμ λ§ |
| μ κ·Ό λ°©μ | .value νμ | μ§μ μ κ·Ό |
| ꡬ쑰λΆν΄ | toRefs() μ¬μ© μ μ μ§ | λ°μμ± μμ |
| μ¬ν λΉ | .valueλ‘ κ°λ₯ | λ°μμ± μμ |
| κΉμ λ°μν | O (κ°μ²΄μΌ λ) | O |
Vue 곡μ λ¬Έμμμλ refλ₯Ό κΈ°λ³ΈμΌλ‘ μ¬μ©νλ κ²μ κΆμ₯ν©λλ€. reactiveμ μ μ½ μ¬νλ€ λλ¬Έμ μμμΉ λͺ»ν λ²κ·Έλ₯Ό λ§λ€κΈ° μ½κΈ° λλ¬Έμ
λλ€.
shallowRef vs shallowReactive
refμ reactiveλ λͺ¨λ κΉμ(deep) λ°μνμ
λλ€. μ€μ²©λ κ°μ²΄μ μ΄λ€ μμ±μ λ°κΏλ κ°μ§ν©λλ€. νμ§λ§ ν° κ°μ²΄μμ κΉμ λ°μνμ΄ λΆνμνλ€λ©΄ μ±λ₯μ λΆλ΄μ΄ λ μ μμ΅λλ€.
μ΄λ μ¬μ©νλ κ²μ΄ shallowRefμ shallowReactiveμ
λλ€. μμ(shallow) λ°μνμΌλ‘, μ΅μμ λ λ²¨λ§ κ°μ§ν©λλ€.
shallowRef
<script setup>
import { shallowRef } from "vue";
const user = shallowRef({ name: "Kwan", age: 30 });
// .value μ체λ₯Ό κ΅μ²΄νλ©΄ λ°μνμΌλ‘ κ°μ§
user.value = { name: "Lee", age: 25 }; // κ°μ§λ¨
// κΉμ μμ± λ³κ²½μ κ°μ§λμ§ μμ
user.value.name = "Park"; // κ°μ§ μ λ¨ (UI μ
λ°μ΄νΈ μμ)
</script>
shallowRefλ .valueμ κ΅μ²΄λ§ μΆμ ν©λλ€. λ΄λΆ μμ±μ μ§μ λ°κΎΈλ©΄ Vueκ° μμμ±μ§ λͺ»ν©λλ€.
κ·Έλ°λ° μμκ°(number, string λ±)μ shallowRefμ λ£μΌλ©΄ μ΄λ¨κΉμ? μμκ°μ μ μ΄μ μ€μ²© μμ±μ΄ μκΈ° λλ¬Έμ .value κ΅μ²΄κ° κ³§ κ° λ³κ²½μ
λλ€. μ¦, κΉμ λ°μν λ³νμ΄ λ°μν μ¬μ§κ° μμ΄ refλ³΄λ€ λΆνμν μ€λ²ν€λ μμ΄ λμν©λλ€.
import { shallowRef } from 'vue'
const count = shallowRef(0)
count.value = 10 // κ°μ§λ¨ (μμκ°μ νμ .value κ΅μ²΄μ΄λ―λ‘ μμ°μ€λ½κ² λμ)
λ¨μν μμκ° μνλ₯Ό λ€λ£° λ shallowRefλ₯Ό μ¬μ©νλ©΄, κ°μ΄ κ°μ²΄λ‘ νμ₯λλλΌλ μλμΉ μμ κΉμ λ°μν λ³νμ λ°©μ§ν μ μμ΄ μ±λ₯ λ©΄μμ μ 리ν©λλ€.
κΉμ μμ±μ λ³κ²½ν λ€ κ°μ λ‘ λ°μμν€κ³ μΆλ€λ©΄ triggerRef()λ₯Ό μ¬μ©ν μ μμ΅λλ€.
import { shallowRef, triggerRef } from "vue";
const user = shallowRef({ name: "Kwan" });
user.value.name = "Lee"; // μ΄κ²λ§μΌλ‘λ UI μ
λ°μ΄νΈ μ λ¨
triggerRef(user); // μλμΌλ‘ νΈλ¦¬κ±°νλ©΄ UI μ
λ°μ΄νΈ
shallowReactive
<script setup>
import { shallowReactive } from "vue";
const state = shallowReactive({
name: "Kwan",
nested: { count: 0 },
});
// μ΅μμ μμ± λ³κ²½μ κ°μ§
state.name = "Lee"; // κ°μ§λ¨
// μ€μ²© μμ± λ³κ²½μ κ°μ§ μ λ¨
state.nested.count++; // κ°μ§ μ λ¨ (UI μ
λ°μ΄νΈ μμ)
</script>
shallowReactiveλ κ°μ²΄μ 1depth μμ±λ§ λ°μνμΌλ‘ μΆμ ν©λλ€. μ€μ²©λ κ°μ²΄μ λ³κ²½μ κ°μ§νμ§ μμ΅λλ€.
μΈμ shallowλ₯Ό μΈκΉ?
λλΆλΆμ κ²½μ°μλ refμ reactiveλ‘ μΆ©λΆν©λλ€. shallow λ²μ μ λ€μκ³Ό κ°μ μν©μμ κ³ λ €νλ©΄ μ’μ΅λλ€.
- ν° λ¦¬μ€νΈλ 볡μ‘ν κ°μ²΄λ₯Ό λ€λ£¨λλ°, λ΄λΆ μμ±μ λ³κ²½μ μΌμΌμ΄ μΆμ ν νμκ° μμ λ
- μΈλΆ λΌμ΄λΈλ¬λ¦¬μ κ°μ²΄λ₯Ό λ°μνμΌλ‘ κ°μΈμΌ νμ§λ§, λ΄λΆ ꡬ쑰κΉμ§ νλ‘μλ‘ λ§λ€κ³ μΆμ§ μμ λ
- μ±λ₯ μ΅μ νκ° νμν κ²½μ° (κΉμ λ°μνμ μ€μ²©λ λͺ¨λ μμ±μ νλ‘μλ₯Ό μμ±)
μ€μ λ‘ Vueμ λ΄λΆ μ½λμμλ μ»΄ν¬λνΈ μΈμ€ν΄μ€λ₯Ό shallowReactiveλ‘ κ΄λ¦¬ν©λλ€. λͺ¨λ λ΄λΆ μμ±κΉμ§ κΉκ² μΆμ ν νμκ° μκΈ° λλ¬Έμ΄μ£ .
λ§μΉλ©°
λ€ κ°μ§ APIλ₯Ό ν μ€λ‘ μ 리νλ©΄ μ΄λ μ΅λλ€.
| API | λμ | λ°μν κΉμ΄ | μ κ·Ό λ°©μ |
|---|---|---|---|
ref | λͺ¨λ νμ | κΉμ(deep) | .value |
shallowRef | λͺ¨λ νμ | μμ(shallow) | .value |
reactive | κ°μ²΄ νμ | κΉμ(deep) | μ§μ μ κ·Ό |
shallowReactive | κ°μ²΄ νμ | μμ(shallow) | μ§μ μ κ·Ό |
κΈ°λ³Έμ μΌλ‘λ refλ₯Ό μ¬μ©νκ³ , μ±λ₯ μ΅μ νκ° νμν νΉμν κ²½μ°μλ§ shallow λ²μ μ κ³ λ €νλ κ²μ΄ μ’κ² μ΅λλ€. reactiveλ .value μμ΄ μ¬μ©ν μ μμ΄ νΈλ¦¬νμ§λ§ ꡬ쑰λΆν΄λ μ¬ν λΉ μ λ°μμ±μ μλ μ μ½μ΄ μμΌλ μ£Όμν΄μ μ¬μ©ν©μλ€.