1. Vue 3.4 변경점 파헤치기
- 23년 12월 29일에 Vue 3.4 버전이 출시되고, 여러 기능이 추가되었다.
- 이번 시간에는 어떤 기능이 출시되고, 어떤 점이 변경되었는지
ChangeLog.md
를 토대로 살펴보았다 🙂
(1) v-bind의 키와 값이 같다면 짧게
- JS에서는 키와 값 변수가 같은 경우, 축약할 수 있다. (property shorthand)
const age = 12;
const person = {
name: 'luxxxx',
age: age // 축약 전
}
const person = {
name: 'luxxxx',
age // 축약 후
}
- v3.4에서는 property shorthand 형태로, 값 바인딩(
v-bind
)을 축약할 수 있다. (공식문서) - 아래 코드는 속성키(
src
)와 값(src
)이 같아 축약한 예시이다.
<template>
<img v-bind:src="src" /> <!-- 축약 전 -->
<img v-bind:src /> <!-- 축약 후(1) -->
<img :src /> <!-- 축약 후(2) -->
</template>
<script setup>
import { ref } from 'vue'
const src = ref('Hello World!');
</script>
v-bind
이외에도v-slot
도 축약형으로 사용할 수 있다. (공식문서)
<template #[dynamicSlotName]>
...
</template>
(2) validator에 props 값 접근 가능
- 3.4 이전 버전에서,
props
의validator
에서 현재prop
값만 인자로 제공했다.
const props = defineProps({
name: {
type: Number,
validator: (value) => ( ... ) // 현재 prop값만 사용 가능
}
});
- 그러나 3.4 버전에서는
props
유효성 검사를 할 때, 다른props
값을 사용할 수 있다.
interface PropOptions<T = any, D = T> {
validator?(value: unknown, props: Data): boolean // value(현재값), props(다른 props값)
...
}
const props = defineProps({
name: {
type: Number,
validator: (value, props) => ( ... )
}
});
- 한 예시로,
props
로 넘긴value
값이props.min
,props.max
사이인지validator
로 검사할 수 있다.
<script setup>
const props = defineProps({
min: {
type: Number,
default: 0,
}
max: {
type: Number,
default: 10,
}
value: {
type: Number,
validator: (value, props) => {
// value는 min이상 max이하인 값만 유효함
return value >= props.min && value <= props.max;
}
}
});
</script>
(3) defindModel로 v-model를 쉽게 컨트롤
- 3.4 버전 이전에는
props
데이터를 하위 컴포넌트에서 수정할 때emit
이벤트를 전송해야했다. - 아래 코드는 버튼 클릭시,
emit
이벤트로props
데이터를 변경하는 예시이다.
<!-- Parent.vue -->
<template>
<Child :count="count" @btn-count-clicked="() => count++" />
</template>
<script setup>
import { ref } from 'vue';
const count = ref(0);
</script>
<!-- Child.vue -->
<template>
<button @click="emit('btn-count-clicked')">숫자 증가</button>
</template>
<script setup>
const props = defineProps({
count: {
type: Number,
default: 0
}
});
const emit = defineEmits(['btn-count-clicked']);
</script>
- 3.4 버전 이후에는 좀 더 간단한 방법으로
props
데이터를 컨트롤 할 수 있다. - 하위 컴포넌트에서
defineModel
을 사용하면,props
데이터를 변경할 수 있다.
<!-- Child.vue -->
<template>
<button @click="count++">숫자 증가</button>
</template>
<script setup>
const count = defineModel('count', { type: Number, default: 0 });
</script>
(4) watch를 한번만 감지할 수 있다
- 특정 값이 변경되었는지 한 번만 감지할 수 없을까?
- 3.4 버전 이전에는 값을 한 번만 감지하고 싶다면
unwatch
를 써야 했다. (playground 보기)
const unwatcher = watch(text, () => {
console.log('text 변경');
unwatcher(); // watch가 실행되면, watch 중단시킴
});
- 하지만 3.4 버전에서
once
옵션이 제공되어,watch
에서 값 변경을 한 번만 감지할 수 있다! (문서 보기)
watch(count, cb, { once: true });
- 작동 예시는 playground에서 볼 수 있다.
const unwatcher = watch(text, () => {
console.log('text 변수의 변화를 한 번만 감지한다');
}, { once: true });
(5) computed에서 oldValue 접근
computed
에서setter
&getter
로, 계산값을 수정하거나 리턴할 수 있었다.
const firstName = ref('John');
const lastName = ref('Doe');
const fullName = computed({
get() {
return firstName.value + ' ' + lastName.value;
},
set(newValue) {
[firstName.value, lastName.value] = newValue.split(' ');
}
})
- 3.4 버전에서는
getter
에oldValue
인자가 추가되었다.
ComputedGetter<T> = (oldValue?: T) => T;
- 그래서
computed
의getter
에서 계산값의 이전값을 사용할 수 있다. - 실제 실행 예시는 playground에서 볼 수 있다.
const firstName = ref('John');
const lastName = ref('Doe');
const fullName = computed({
get(oldValue) {
if (!oldValue) return firstName.value;
else return firstName.value + ' ' + oldValue;
},
set(newValue) {
[firstName.value, lastName.value] = newValue.split(' ')
}
})
2. 마치며…
- 이번 시간에는 vue/core 레포의
ChangeLog.md
에서 3.4 변경점을 확인해보았다. v-bind
을 축약형으로 선언할 수 있고,props
를 간단히 컨트롤 할 수 있으며,once
옵션으로 데이터를 한 번만 감지하는 기능 등이 추가되었다.- 현재로서 Docs에 모든 내용이 작성되어 있지 않아, 변경점을 추적하고 싶다면
ChangeLog.md
를 보는 것도 방법이다.
반응형
'개발 기술 > 개발 이야기' 카테고리의 다른 글
[vscode] 컬러 변수 뷰어 만들기(2) - colorvariabletracker (0) | 2024.03.31 |
---|---|
[vscode] 컬러 변수 뷰어 만들기(1) - webview API 사용법 (4) | 2024.03.16 |
feature flag로 지속적 배포하기(with. postHog, react) (0) | 2024.01.20 |
[JS] 메모리 누수는 왜 발생할까?(feat. 메모리 측정법) (10) | 2023.12.22 |
구글 검색 엔진과 SEO을 알아보자!(with. SEO 측정 방법) (2) | 2023.11.12 |
댓글