Vue에서 Directive는 v-라는 접두어를 가진 v-model, v-show, v-bind등을 말한다.
그중에 개발자가 직접 정의하여 사용하는 Custom Directive를 알아보자.
<template>
<div>
<!-- 숫자만 입력하는 폼 -->
<input type="text" v-number />
</div>
</template>
<script>
export default {
// Directive 설정
directives: {
number: {
mounted(el) {
el.addEventListener('input', (e) => {
e.target.value = e.target.value.replace(/[\D]/g, '')
})
}
}
},
}
</script>
이런식으로 v-number라는 custom directive를 세팅하기 위해 directives에 number안에 라이프 사이클 훅(created, mounted, updated, unmounted등)을 넣어서 사용한다.
// main.js
app.directive('number', {
mounted(el) {
el.addEventListener('input', (e) => {
e.target.value = e.target.value.replace(/[\D]/g, '')
})
}
})
설정만 main.js에 해주고 template에서는 사용법이 같다.
app.directive("font-size", (el, binding) => {
el.style.fontSize = 24 + "px";
});
라이프 사이클 훅을 쓰지 않고 바로 함수를 directive설정하면 beforeMount, updated훅에 설정한 것처럼 작동한다.
app.directive('font-size', (el, binding) => {
el.style.fontSize = binding.value + 'px'
})
binding을 이용하면 반응형 데이터로 작성할 수 있다.
// main.js
// 소문자만
app.directive('lowercase', {
mounted(el) {
el.addEventListener('input', (e) => {
e.target.value = e.target.value.toLowerCase()
})
}
})
// 대문자만
app.directive('uppercase', {
mounted(el) {
el.addEventListener('input', (e) => {
e.target.value = e.target.value.toUpperCase()
})
}
})
// 숫자만
app.directive('number', {
mounted(el) {
el.addEventListener('input', (e) => {
e.target.value = e.target.value.replace(/[\D]/g, '')
})
}
})
// 한글만
app.directive('korean', {
mounted(el) {
el.addEventListener('input', (e) => {
e.target.value = e.target.value.replace(/[^ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/g, '')
})
}
})
main.js에 custom directive를 전역설정으로 모아놓고 사용하면 편리하다.
웹 애플리케이션을 개발할 때 효율적이고, 빠르게 개발할 수 있도록 도와주는 Custom Directive에 대해서 알아보았다.
어떤 것을 Custom Directive로 만들면 좋을지 생각해보고, 앞으로 나의 자산이 될 수도 있는 directive를 만들어 봐야겠다.
Vue.js - Custom Directives
Vue.js 커스텀 Directive 만들어보기
개발자의품격 부트캠프