6 Vue3โจ๐์ ref ๋ฐ ๋ฐ์ํ ์ง๋ฌธ์ ์ดํดํด์ผ ํฉ๋๋ค.
21522 ๋จ์ด vuetutorialjavascriptwebdev
ref
๋ฐ reactive
๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ด API๋ Vue3 ๊ฐ๋ฐ ํ๋ก์ ํธ์์ ์์ฃผ ์ฌ์ฉํ๋ ๋ ๊ฐ์ง API์ด๊ธฐ๋ ํฉ๋๋ค.์ด ๋ฌธ์์์๋ ์๊ฐ ๊ด์ ์์ ์ด ๋ API๋ฅผ ์๊ฐํฉ๋๋ค. ์ค๋ฅ๊ฐ ์์ผ๋ฉด ํจ๊ป ํ ๋ก ํ๊ณ ๋ฐฐ์ฐ์ญ์์ค ~
This article uses Vue3 setup syntax.
์ด์ฌ์ ๋จ๊ณ์์ ๋ง์คํฐํด์ผ ํ ๊ฒ์ ์ด ๋ API์ "๋ฌด์", "์ฌ์ฉ ๋ฐฉ๋ฒ"๋ฐ "๊ณตํต ๋ฌธ์ "์ ๋๋ค.
1. ๋ฆฌ์กํฐ๋ธ API๋ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์?
reactive
๋ฉ์๋๋ ๋ฐ์ํ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐ์ฒด/๋ฐฐ์ด ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ๊ฐ์ฒด์ ๋ฐ์ํ ์ฌ๋ณธ์ ๋ฐํํฉ๋๋ค. ๊ฐ์ฒด์ ์์ฑ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋๋ ์์น๊ฐ ์๋์ผ๋ก ์
๋ฐ์ดํธ๋ฉ๋๋ค.๊ฐ์ฒด ๋ฐ ๋ฐฐ์ด์ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ์ฌ ํ ์คํธ:
import { reactive } from 'vue'
let reactiveObj = reactive({ name : 'Chris1993' });
let setReactiveObj = () => {
reactiveObj.name = 'Hello Chris1993';
}
let reactiveArr = reactive(['a', 'b', 'c', 'd']);
let setReactiveArr = () => {
reactiveArr[1] = 'Hello Chris1993';
}
ํ ํ๋ฆฟ ์ฝํ ์ธ :
<template>
<h2>Vue3 reactive API Base</h2>
<div>
Object:{{reactiveObj.name}}
<span @click="setReactiveObj">Update</span>
</div>
<div>
Array:{{reactiveArr}}
<span @click="setReactiveArr">Update</span>
</div>
</template>
ํ์ด์ง ๋ด์ฉ:
Update
๋ฒํผ์ ๊ฐ๊ฐ ํด๋ฆญํ๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ํ ๋ทฐ์ ์ฝํ
์ธ ๋ ํจ๊ป ์
๋ฐ์ดํธ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.2. ์ฐธ์กฐ API๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
ref
์ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ ํ(primitive data type)์ ๋ฐ์ํ ํน์ง์ ๊ฐ์ง ๋ฐ์ดํฐ ์ ํ์ผ๋ก ๋ณํํ๋ ๊ฒ์ด๋ค. 7๊ฐ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ ํ์ด ์์ต๋๋ค.JS/TS์์
String
์ ๊ฐ์ ์ฝ๊ณ ์์ ํ๋ ๊ฒฝ์ฐ์๋ Number
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ธ์์ผ ํ๋ฉฐ ํ
ํ๋ฆฟ์์ ์ฝ์ ๊ฒฝ์ฐ์๋ BigInt
๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค.๋ฌธ์์ด๊ณผ ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ์ฌ ํ ์คํธ:
import { ref } from 'vue'
let refValue = ref('Chris1993');
let setRefValue = () => {
refValue.value = 'Hello Chris1993';
}
let refObj = ref({ name : 'Chris1993' });
let setRefObj = () => {
refObj.value.name = 'Hello Chris1993';
}
ํ ํ๋ฆฟ ์ฝํ ์ธ :
<template>
<h2>Vue3 ref API Base</h2>
<div>
String:{{refValue}}
<span @click="setRefValue">Update</span>
</div>
<div>
Object:{{refObj.name}}
<span @click="setRefObj">Update</span>
</div>
</template>
ํ์ด์ง ๋ด์ฉ:
Boolean
๋ฒํผ์ ๊ฐ๊ฐ ํด๋ฆญํ๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ํ ๋ทฐ์ ์ฝํ
์ธ ๋ ํจ๊ป ์
๋ฐ์ดํธ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.3. ์ฌ์ธต ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ๋ํด reactive๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๊น?
๋๋ต์ ์์ ๋๋ค.
Symbol
๋ ES2015 Proxy API์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋๋ฉฐ ์๋ต์ฑ์ ์ ์ฒด ๊ฐ์ฒด์ ๋ชจ๋ ์ค์ฒฉ ์์ค์
๋๋ค.๊ฐ์ฒด ๋ฐ ๋ฐฐ์ด์ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ์ฌ ํ ์คํธ:
import { reactive } from 'vue'
let reactiveDeepObj = reactive({
user: {name : 'Chris1993'}
});
let setReactiveDeepObj = () => {
reactiveDeepObj.user.name = 'Hello Chris1993';
}
let reactiveDeepArr = reactive(['a', ['a1', 'a2', 'a3'], 'c', 'd']);
let setReactiveDeepArr = () => {
reactiveDeepArr[1][1] = 'Hello Chris1993';
}
ํ ํ๋ฆฟ ์ฝํ ์ธ :
<template>
<h2>Vue3 reactive deep API Base</h2>
<div>
Object:{{reactiveDeepObj.user.name}}
<span @click="setReactiveDeepObj">Update</span>
</div>
<div>
Array:{{reactiveDeepArr}}
<span @click="setReactiveDeepArr">Update</span>
</div>
</template>
ํ์ด์ง ๋ด์ฉ:
Null
๋ฒํผ์ ๊ฐ๊ฐ ํด๋ฆญํ๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ํ ๋ทฐ์ ์ฝํ
์ธ ๋ ํจ๊ป ์
๋ฐ์ดํธ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.4. ๋ฐ์ ๋ฐํ ๊ฐ์ด ์์ค ๊ฐ์ฒด์ ๊ฐ์๊ฐ?
Undefined
๊ฐ ES2015 Proxy API์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋์๊ธฐ ๋๋ฌธ์ ๋๋ต์ ๊ฐ์ง ์์ต๋๋ค. ๋ฐํ ๊ฒฐ๊ณผ๋ ํ๋ก์ ๊ฐ์ฒด์
๋๋ค.ํ ์คํธ ์ฝ๋:
let reactiveSource = { name: 'Chris1993' };
let reactiveData = reactive(reactiveSource);
console.log(reactiveSource === reactiveData);
// false
console.log(reactiveSource);
// {name: 'Chris1993'}
console.log(reactiveData);
// Reactive<{name: 'Chris1993'}>
5. TypeScript๋ ref ๋ฐ ๋ฐ์ ๋งค๊ฐ๋ณ์ ์ ํ์ ์ด๋ป๊ฒ ์์ฑํฉ๋๊น?
TypeScript๋ฅผ ์ฌ์ฉํ์ฌ ref/reactive ๋งค๊ฐ๋ณ์ ์ ํ์ ์์ฑํ ๋ ref/reactive ์ธํฐํ์ด์ค ์ ํ์ ๋ฐ๋ผ ํน์ ์ ํ์ ๊ตฌํํ ์ ์์ต๋๋ค.
function ref<T>(value: T): Ref<T>
function reactive<T extends object>(target: T): UnwrapNestedRefs<T>
์ด์ ์์ ์ฝ๋๋ฅผ ์์ ํฉ๋๋ค.
import { ref } from 'vue'
let refValue = ref<string>('Chris1993');
let setRefValue = () => {
refValue.value = 'Hello Chris1993'; // ok!
refValue.value = 1993; // error!
}
let reactiveValue = reactive<{name: string}>({name: 'Chris1993'});
6. ๋ฐ์ ๋งค๊ฐ๋ณ์๋ก์์ ref ๊ฐ์ ์ด๋ป์ต๋๊น?
์ด๋ฏธ
ref
๊ฐ์ฒด๊ฐ ์๊ณ ์ด๋ฅผ .value
๊ฐ์ฒด์์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๋ฉ๋๊น?๊ฐ์ ํ๋ค:
let name = ref('Chris1993');
let nameReactive = reactive({name})
๋ค์๊ณผ ๊ฐ์ด ํ ์๋ ์์ต๋๋ค.
let name = ref('Chris1993');
let nameReactive = reactive({name})
console.log(name.value === nameReactive.name); // true
name.value = 'Hello Chris1993';
console.log(name.value); // Hello Chris1993
console.log(nameReactive.name); // Hello Chris1993
nameReactive.name = 'Hi Chris1993';
console.log(name.value); // Hi Chris1993
console.log(nameReactive.name); // Hi Chris1993
์ด๋
.value
๊ฐ ๋ชจ๋ ๋ฅUpdate
์ ์์ถ์ ํ๊ณ reactive
๋ฅผ ๋ฐ์ํ์ผ๋ก ์ ์งํ๊ธฐ ๋๋ฌธ์
๋๋ค.Update
๊ฐ ํ ๋น์ ์ํด reactive
์์ฑ์ ํ ๋น๋๋ฉด ref
๋ ์๋์ผ๋ก ์์ถ ํด์ ๋ฉ๋๋ค.let name = ref('Chris1993');
let nameReactive = reactive({})
nameReactive.name = name;
console.log(name.value); // Chris1993
console.log(nameReactive.name); // Chris1993
console.log(name.value === nameReactive.name); // true
7. ์์ฝ
์ด ๊ธ์ ์ฃผ๋ก ์์ํ๋ ๊ด์ ์์
reactive
/reactive
API ์ฌ์ฉ์ ์ฐจ์ด์ ๊ณผ ์ฌ์ฉ ํ๋ก์ธ์ค์ ์ฌ๋ฌ ๋ฌธ์ ์ ์ ์๊ฐํฉ๋๋ค.๊ฐ๋จํ ์์ฝํ์๋ฉด:
refs
๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฒด/๋ฐฐ์ด ์ ํ ๋ฐ์ดํฐ์ ์ฌ์ฉ๋๋ฉฐ ref
๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค. ref
๋ ์ผ๋ฐ์ ์ผ๋ก ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ ํ์ ๋ฐ์ดํฐ์ ์ฌ์ฉ๋ฉ๋๋ค. JS์์ ์ฝ๊ณ ์์ ํ ๋ reactive
๋ฅผ ์ฌ์ฉํด์ผ ํ์ง๋ง ํ
ํ๋ฆฟ์์ ์ฌ์ฉํ ๋๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ref
๋ ๊น์ ์์ฑ ๊ฐ์ ์์ ํ๊ณ ์๋ต์ฑ์ ์ ์งํ ์ ์์ต๋๋ค. reactive
๋ฐํ ๊ฐ์ด ์์ค ๊ฐ์ฒด์ ๋ค๋ฆ
๋๋ค. ref
์์ฑ ๊ฐ์ reactive
๊ฐ์ผ ์ ์์ต๋๋ค. ๋ค์ ๊ธฐ์ฌ์์๋ ์๋ฌ๋ ๋ด์ฉ์ ๊ณต์ ํ ๊ฒ์ด๋ฉฐ ๊ธฐ๋ํ์ ๋ ์ข์ต๋๋ค.
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(6 Vue3โจ๐์ ref ๋ฐ ๋ฐ์ํ ์ง๋ฌธ์ ์ดํดํด์ผ ํฉ๋๋ค.), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/chris1993/6-you-should-understand-the-ref-and-reactive-questions-in-vue3-10ijํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค