[Vue.js] 새로운 v-model 살펴보기#3 (v-model custom modifiers)
하수도키
·2021. 1. 31. 17:43
728x90
반응형
SMALL
v-model 수식어(v-model modifiers)
- 지난 포스팅에서 2개의
v-model
을 사용하는 법을 살펴봤다. - 이번 포스팅에서는
vue3
에서v-model
커스텀 수식어(modifiers)를 사용하는 것을 살펴보겠다.
v-model 수식어 살펴보기
vue2
에서 사용했던v-model
수식어들도vue3
에서 사용이 가능하다..lazy
:input
이벤트 대신change
이벤트를 받는다..number
: 문자를 유효한 숫자로 변경한다.trim
: 공백을 없애준다.
v-model 커스텀 수식어 살펴보기
- 이전 포스팅에 만들었던
SalutationName
컴포넌트를 이어서 사용한다. capitalize
라는 수식어를 만들어 보겠다.v-model:model
선언 후에.
추가한 다음 수식어를 적어주면 된다.salutation
에는 모든 문자를 대문자로 변경하는 수식어v-model:salutation.capitalize="form.salutation"
name
에는 첫번째 문자만 대문자로 변경하는 수식어v-model:name.capitalize="form.name"
// App.vue
<template>
<div id="app">
<SalutationName
v-model:salutation.capitalize="form.salutation"
v-model:name.capitalize="form.name"
/>
<pre>{{ form }}</pre>
</div>
</template>
- 위와 같이 사용하려면 우선
props
로modifiers
를 생성해야 한다.salutationModifiers
는v-model
salutation
과 바인딩nameModifiers
는v-model
name
과 바인딩
// SalutationName.vue
[...]
props: {
salutation: {
type: String,
default: ''
},
salutationModifiers: {
default: () => ({}),
type: Object
},
name: {
type: String,
default: ''
},
nameModifiers: {
default: () => ({}),
type: Object
}
},
[...]
salutationModifiers, nameModifiers
기본값이 빈객체이다.- 수식어가 있으면 객체에
boolean
으로modifier
의 이름을key
로value
는true
로 추가된다. 만약 없으면 빈객체를 유지한다. capitalize
수식어가 있으면 아래 객체처럼 된다.
{
capitalize: true
}
SalutationName 컴포넌트 개선하기
- 이제
SalutationName
컴포넌트를 개선해보자. - 기존에는 이벤트가 발생하면 바로 인라인으로
$emit
을 작성했지만, 이걸methods
쪽에 함수로 빼서 커스텀 수식어에 대한 로직을 추가하자.
// SalutationName.vue
<template>
<div>
<select
name="salutation"
@change="updateSalutation" // 이 부분이 변경
>
<option value="">-</option>
<option
v-for="item of salutations"
:value="item"
:key="item"
:selected="salutation === item"
>
{{ item }}
</option>
</select>
<input
:value="name"
@input="updateName" // 이 부분이 변경
type="text"
name="name"
/>
</div>
</template>
<script>
const salutations = [...]
export default {
props: {
salutation: {
type: String,
default: ''
},
// Holds the modifiers for the salutation v-model
salutationModifiers: {
default: () => ({})
},
name: {
type: String,
default: ''
},
// Holds the modifiers for the name v-model
nameModifiers: {
default: () => ({})
}
},
setup (props, { emit }) {
// vue3 setup 사용
// salutation, name에 대한 이벤트를 함수로 정의하는 로직으로 개선
// 현재 상태는 코드 변경전이랑 똑같이 작동한다.
const updateSalutation = event => {
let val = event.target.value
emit('update:salutation', val)
}
const updateName = event => {
let val = event.target.value
emit('update:name', val)
}
return {
salutations,
updateSalutation,
updateName
}
}
}
</script>
setup()
함수는 첫번째 인자는props
를 받고 두번째 인자는 컴포넌트 인스턴스context
를 받는다. 그 안에emit
이 있다.- 이제
updateX
함수에capitalize
수식어가 있을 경우 대한 로직을 추가하자.
// SalutationName.vue
setup (props, { emit }) {
const updateSalutation = event => {
let val = event.target.value
if (props.salutationModifiers.capitalize) {
val = val.toUpperCase()
}
emit('update:salutation', val)
}
const updateName = event => {
let val = event.target.value
if (props.nameModifiers.capitalize) {
val = val.charAt(0).toUpperCase() + val.slice(1)
}
emit('update:name', val)
}
return {
salutations,
updateSalutation,
updateName
}
}
문제
- 이번에 알아본 포스팅을 한번 더 복습하고자 문제를 냅니다.
name
에 대한 수식어를 추가reverse
라는 수식어를 추가하면name
value
가 반대로 나오게 작성해보자.- tip : 수식어들은 체이닝이 가능하다.
v-model:name.capitalize.reverse="form.name"
결론
modifiers(수식어)
에 대한 개념이 잡혔고props
로 객체로 받고 수식어에 대한 값을boolean
으로 체크 하는 로직을 알게 되어 내부적으로vue
에 대한 지식이 깊어진것 같다.
예제코드
2021/01/22 - [개발일기/Vue.js] - [Vue.js] 새로운 v-model 살펴보기#1 (vue3에서 바뀐 점)
2021/01/28 - [개발일기/Vue.js] - [Vue.js] 새로운 v-model 살펴보기#2 (다수의 v-model 사용하기)
728x90
반응형
LIST
'개발일기 > Vue.js' 카테고리의 다른 글
[Vue.js] 새로운 v-model 살펴보기#5(Multi root components) (0) | 2021.03.01 |
---|---|
[Vue.js] 새로운 v-model 살펴보기#4 ($attrs, $listeners) (1) | 2021.02.07 |
[Vue.js] 새로운 v-model 살펴보기#2 (다수의 v-model 사용하기) (0) | 2021.01.28 |
[Vue.js] 새로운 v-model 살펴보기#1 (vue3에서 바뀐 점) (0) | 2021.01.22 |
[Vue.js] vue-router로 정적 라우트를 만들어보자. (0) | 2020.12.08 |