Appearance
유효성 검사
유효성 검사는 필수입력 항목의 값이 null, undefined, ''
일때, 체크박스는 체크한것이 없을때 alert을 띄우고 포커스한다.
VmConatiner 방식
VmContainer
에 ref를 만들고, required()
를 실행한다.
<VmContainer ref="containerRef">
<VmSearch label="VmSearch" v-model="containerData.search" required />
<VmCheckbox label="VmCheckbox - toggle" v-model="containerData.checkboxSingle" toggle required/>
<VmCheckbox label="VmCheckbox - multi" v-model="containerData.checkboxMulti"
table-id="CMM_CODE" code="CMM003" required />
<VmRadio label="VmRadio" v-model="containerData.radio" table-id="CMM_CODE" code="CMM003"
uncheckable required />
<VmDate label="VmDate" v-model="containerData.date" required />
<VmMonth label="VmMonth" v-model="containerData.month" required />
<VmYear label="VmYear" v-model="containerData.year" required />
<VmDateRange label="VmDateRange - 모두필수"
v-model:stt="containerData.dateRangeStt"
v-model:end="containerData.dateRangeEnd" required />
<VmDateRange label="VmDateRange - 시작필수"
v-model:stt="containerData.dateRangeSttStt"
v-model:end="containerData.dateRangeSttEnd" required-stt />
<VmDateRange label="VmDateRange - 종료필수"
v-model:stt="containerData.dateRangeEndStt"
v-model:end="containerData.dateRangeEndEnd" required-end />
<VmMonthRange label="VmMonthRange - 모두필수"
v-model:stt="containerData.monthRangeStt"
v-model:end="containerData.monthRangeEnd" required />
<VmMonthRange label="VmMonthRange - 시작필수"
v-model:stt="containerData.monthRangeSttStt"
v-model:end="containerData.monthRangeSttEnd" required-stt />
<VmMonthRange label="VmMonthRange - 종료필수"
v-model:stt="containerData.monthRangeEndStt"
v-model:end="containerData.monthRangeEndEnd" required-end />
<VmSelect label="VmSelect" v-model="containerData.select"
option-first="ALL" table-id="CMM_CODE" code="CMM003"
required />
<VmTextarea label="VmTextarea" v-model="containerData.textarea" required />
</VmContainer>
import VmContainerVue from "@/core/components/container/VmContainer.vue"
const containerData = reactive({
search: '',
checkboxSingle: '',
checkboxMulti: [],
radio: '',
date: '',
month: '',
year: '',
dateRangeStt: '',
dateRangeEnd: '',
dateRangeSttStt: '',
dateRangeSttEnd: '',
dateRangeEndStt: '',
dateRangeEndEnd: '',
monthRangeStt: '',
monthRangeEnd: '',
monthRangeSttStt: '',
monthRangeSttEnd: '',
monthRangeEndStt: '',
monthRangeEndEnd: '',
select: '',
textarea: ''
})
const containerRef = ref<InstanceType<typeof VmContainerVue>>()
async function requiredContainer(errorMsg: boolean) {
// 1 VmContainer 하위 컴포넌트에 required 가 있는것의 입력여부 검사
// 값이 없으면 alert하고 focus 한다.
const result = await containerRef.value?.required()
// 2 컴포넌트에 v-model의 필드명과 동일한 name속성 지정하고 파라미터로 data
// const result = await containerRef.value?.required(containerData)
// 3 두버째 파라미터로 errorMsg 옵션있으면 required가 있는 것을 전부 검사해서 메시지를 반환
// const result = await containerRef.value?.required(undefined, { errorMsg, debug: true })
}
Component의 ref 방식
컴포넌트에 required
와 ref
지정하고 required
함수로 검사
<VmContainer col="2" ref="containerRef" style="overflow:auto">
<VmSearch label="VmSearch" v-model="refData.search" name="search" ref="searchRef" required />
<VmCheckbox label="VmCheckbox - toggle" v-model="refData.checkboxSingle"
toggle required ref="checkboxRef" />
<VmCheckbox label="VmCheckbox - multi" v-model="refData.checkboxMulti"
table-id="CMM_CODE" code="CMM003" required ref="checkboxRef" />
<VmRadio label="VmRadio" v-model="refData.radio"
table-id="CMM_CODE" code="CMM003"
ref="radioRef" required uncheckable />
<VmDate label="VmDate" v-model="refData.date" ref="dateRef" required />
<VmMonth label="VmMonth" v-model="refData.month" ref="monthRef" required />
<VmYear label="VmYear" v-model="refData.year" ref="yearRef" required />
<VmDateRange label="VmDateRange - 모두필수"
v-model:stt="refData.dateRangeStt" v-model:end="refData.dateRangeEnd"
required ref="dateRangeRef" />
<VmDateRange label="VmDateRange - 시작필수"
v-model:stt="refData.dateRangeSttStt" v-model:end="refData.dateRangeSttEnd"
ref="dateRangeSttRef" required-stt />
<VmDateRange label="VmDateRange - 종료필수"
v-model:stt="refData.dateRangeEndStt" v-model:end="refData.dateRangeEndEnd"
ref="dateRangeEndRef" required-end />
<VmMonthRange label="VmMonthRange - 모두필수"
v-model:stt="refData.monthRangeStt" v-model:end="refData.monthRangeEnd"
ref="monthRangeRef" required />
<VmMonthRange label="VmMonthRange - 시작필수"
v-model:stt="refData.monthRangeSttStt" v-model:end="refData.monthRangeSttEnd"
ref="monthRangeSttRef" required-stt />
<VmMonthRange label="VmMonthRange - 종료필수"
v-model:stt="refData.monthRangeEndStt" v-model:end="refData.monthRangeEndEnd"
ref="monthRangeEndRef" required-end />
<VmSelect label="VmSelect" v-model="refData.select"
option-first="ALL" table-id="CMM_CODE" code="CMM003"
ref="selectRef" required />
<VmTextarea label="VmTextarea" v-model="refData.textarea" ref="textareaRef" required />
</VmContainer>
필수입력 검사 함수
function required(
val: string | number | string[],
element?: Ref<{ inputRef?: HTMLElement | HTMLElement[] | undefined }> | HTMLElement | HTMLElement[],
targetLabel?: string,
fullMsg?: string): Promise<boolean>
import { required } from "@/core"
const refData = reactive({
search: '',
checkboxSingle: '',
checkboxMulti: [],
radio: '',
date: '',
month: '',
year: '',
dateRangeStt: '',
dateRangeEnd: '',
dateRangeSttStt: '',
dateRangeSttEnd: '',
dateRangeEndStt: '',
dateRangeEndEnd: '',
monthRangeStt: '',
monthRangeEnd: '',
monthRangeSttStt: '',
monthRangeSttEnd: '',
monthRangeEndStt: '',
monthRangeEndEnd: '',
select: '',
textarea: ''
})
const searchRef = ref()
const checkboxSingleRef = ref()
const checkboxMultiRef = ref()
const radioRef = ref()
const dateRef = ref()
const monthRef = ref()
const yearRef = ref()
const dateRangeRef = ref()
const dateRangeSttRef = ref<InstanceType<typeof VmDateRangeVue>>()
const dateRangeEndRef = ref<InstanceType<typeof VmDateRangeVue>>()
const monthRangeRef = ref()
const monthRangeSttRef = ref()
const monthRangeEndRef = ref()
const selectRef = ref()
const textareaRef = ref()
// 컴포넌트의 label 속성으로 alert 메시지 표시
async function requiredRefLabel() {
const result =
await required(refData.search, searchRef,) &&
await required(refData.checkboxSingle, checkboxSingleRef) &&
await required(refData.checkboxMulti, checkboxMultiRef) &&
await required(refData.radio, radioRef) &&
await required(refData.date, dateRef) &&
await required(refData.month, monthRef) &&
await required(refData.year, yearRef) &&
// VmDateRange 시작, 종료가 모두 필수
await required(refData.dateRangeStt, dateRangeRef) &&
await required(refData.dateRangeEnd, dateRangeRef) &&
// VmDateRange 시작만 필수. 시작 input참조를 전달.
await required(refData.dateRangeSttStt, dateRangeSttRef.value?.inputRef[0]) && // 시작
await required(refData.dateRangeEndEnd, dateRangeEndRef.value?.inputRef[1]) && // 종료
await required(refData.monthRangeStt, monthRangeRef) &&
await required(refData.monthRangeEnd, monthRangeRef) &&
await required(refData.monthRangeSttStt, monthRangeSttRef.value?.inputRef[0]) &&
await required(refData.monthRangeEndEnd, monthRangeEndRef.value?.inputRef[1]) &&
await required(refData.select, selectRef) &&
await required(refData.textarea, textareaRef)
console.log('requiredRefTargetLabel result = ', result)
}
// 컴포넌트의 label 속성 대신 세번째 파라미터로 필수입력항목 이름을 alert에 표시
async function requiredRefTargetLabel() {
const result =
await required(refData.search, searchRef, '서치') &&
await required(refData.checkboxSingle, checkboxSingleRef, '체크박스 - single') &&
await required(refData.checkboxMulti, checkboxMultiRef, '체크박스 - multi') &&
await required(refData.radio, radioRef, '라디오') &&
await required(refData.date, dateRef, '데이트') &&
await required(refData.month, monthRef, '먼쓰') &&
await required(refData.year, yearRef, '이어') &&
await required(refData.dateRangeStt, dateRangeRef, '데이트레인지-모두필수-시작') &&
await required(refData.dateRangeEnd, dateRangeRef, '데이트레인지-모두필수-종료') &&
await required(refData.dateRangeSttStt, dateRangeSttRef.value?.inputRef[0], '데이트레인지-시작필수-시작') &&
await required(refData.dateRangeEndEnd, dateRangeEndRef.value?.inputRef[1], '데이트레인지-종료필수-종료') &&
await required(refData.monthRangeStt, monthRangeRef, '먼쓰레인지-모두필수-시작') &&
await required(refData.monthRangeEnd, monthRangeRef, '먼쓰레인지-모두필수-종료') &&
await required(refData.monthRangeSttStt, monthRangeSttRef.value?.inputRef[0], '먼쓰레인지-시작필수-시작') &&
await required(refData.monthRangeEndEnd, monthRangeEndRef.value?.inputRef[1], '먼쓰레인지-종료필수-종료') &&
await required(refData.select, selectRef, '셀렉트') &&
await required(refData.textarea, textareaRef, '텍스트에이리어')
console.log('requiredRefTargetLabel result = ', result)
}
// 세번째 파라미터로 필수입력항목 이름대신 네번째 파라미터로 alert 메시지 표시
async function requiredRefFullMsg() {
await required(refData.search, searchRef, '서치', '서치는 필수 입력 항목 입니다.') &&
await required(refData.checkboxSingle, checkboxSingleRef, '체크박스 - single', '여부를 체크해주세요') &&
await required(refData.checkboxMulti, checkboxMultiRef, '체크박스 - multi', '체크박스를 선택해주세요') &&
await required(refData.radio, radioRef, '라디오', '라디오를 선택하세요') &&
await required(refData.date, dateRef, '데이트', '데이트를 입력하세요') &&
await required(refData.month, monthRef, '먼쓰', '먼쓰를 입력하세요') &&
await required(refData.year, yearRef, '이어', '이어는 필수입니다.') &&
await required(refData.dateRangeStt, dateRangeRef, '데이트레인지-모두필수-시작', '데이트레인지시작은 필수 입력 항목 입니다.') &&
await required(refData.dateRangeEnd, dateRangeRef, '데이트레인지-모두필수-종료', '데이트레인지종료은 필수 입력 항목 입니다.') &&
await required(refData.dateRangeSttStt, dateRangeSttRef.value?.inputRef[0], '데이트레인지-시작필수-시작', '데이트레인지 시작필수의 시작은 필수 입력 항목 입니다.') &&
await required(refData.dateRangeEndEnd, dateRangeEndRef.value?.inputRef[1], '데이트레인지-종료필수-종료', '데이트레인지 종료필수의 종료는 필수 입력 항목 입니다.') &&
await required(refData.monthRangeStt, monthRangeSttRef, '먼쓰레인지시작', '먼쓰레인지시작은 필수 입력 항목 입니다.') &&
await required(refData.monthRangeEnd, monthRangeEndRef, '먼쓰레인지종료', '먼쓰레인지종료은 필수 입력 항목 입니다.') &&
await required(refData.monthRangeSttStt, monthRangeSttRef.value?.inputRef[0], '먼쓰레인지-시작필수-시작', '먼쓰레인지-시작필수-시작의 시작먼쓰는 필수입력 입니다.') &&
await required(refData.monthRangeEndEnd, monthRangeEndRef.value?.inputRef[1], '먼쓰레인지-종료필수-종료', '먼쓰레인지-종료필수-종료의 종료먼쓰는 필수입력 입니다.') &&
await required(refData.select, selectRef, '셀렉트', '셀렉트를 선택해주세요') &&
await required(refData.textarea, textareaRef, '텍스트에이리어', '텍스트에이리어를 작성해주세요')
console.groupEnd()
}
template ref 대신 컴포넌트의 name으로 검사
<VmContainer col="2" ref="containerRef" style="overflow:auto">
<VmSearch label="VmSearch" v-model="refData.search" name="search" ref="searchRef" required />
<VmCheckbox label="VmCheckbox - toggle" v-model="refData.checkboxSingle" name="checkboxSingle" required toggle />
<VmCheckbox label="VmCheckbox - multi" v-model="refData.checkboxMulti" name="checkboxMulti" required
table-id="CMM_CODE" code="CMM003" />
<VmRadio label="VmRadio" v-model="refData.radio" name="radio" required
table-id="CMM_CODE" code="CMM003" uncheckable />
<VmDate label="VmDate" v-model="refData.date" name="date" required />
<VmMonth label="VmMonth" v-model="refData.month" name="month" required />
<VmYear label="VmYear" v-model="refData.year" name="year" required />
<VmDateRange label="VmDateRange - 모두필수"
v-model:stt="refData.dateRangeStt" v-model:end="refData.dateRangeEnd"
name-stt="dateRangeStt" name-end="dateRangeEnd" required />
<VmDateRange label="VmDateRange - 시작필수"
v-model:stt="refData.dateRangeSttStt" v-model:end="refData.dateRangeSttEnd"
name-stt="dateRangeSttStt" required-stt />
<VmDateRange label="VmDateRange - 종료필수"
v-model:stt="refData.dateRangeEndStt" v-model:end="refData.dateRangeEndEnd"
name-end="dateRangeEndEnd" required-end />
<VmMonthRange label="VmMonthRange - 모두필수"
v-model:stt="refData.monthRangeStt" v-model:end="refData.monthRangeEnd"
name-stt="monthRangeStt" name-end="monthRangeEnd" required />
<VmMonthRange label="VmMonthRange - 시작필수"
v-model:stt="refData.monthRangeSttStt" v-model:end="refData.monthRangeSttEnd"
name-stt="monthRangeSttStt" required-stt />
<VmMonthRange label="VmMonthRange - 종료필수"
v-model:stt="refData.monthRangeEndStt" v-model:end="refData.monthRangeEndEnd"
name-end="monthRangeEndEnd" required-end />
<VmSelect label="VmSelect" v-model="refData.select" name="select" required
option-first="ALL" table-id="CMM_CODE" code="CMM003" />
<VmTextarea label="VmTextarea" v-model="refData.textarea" name="textarea" required />
</VmContainer>
async function requiredRefRequiredGetElement() {
const result =
await required(refData.search, containerRef.value?.getElement('search')) &&
await required(refData.checkboxSingle, containerRef.value?.getElement('checkboxSingle')) &&
await required(refData.checkboxMulti, containerRef.value?.getElement('checkboxMulti')) &&
await required(refData.radio, containerRef.value?.getElement('radio')) &&
await required(refData.date, containerRef.value?.getElement('date')) &&
await required(refData.month, containerRef.value?.getElement('month')) &&
await required(refData.year, containerRef.value?.getElement('year')) &&
await required(refData.dateRangeStt, containerRef.value?.getElement('dateRangeStt')) &&
await required(refData.dateRangeEnd, containerRef.value?.getElement('dateRangeEnd')) &&
await required(refData.dateRangeSttStt, containerRef.value?.getElement('dateRangeSttStt')) &&
await required(refData.dateRangeEndEnd, containerRef.value?.getElement('dateRangeEndEnd')) &&
await required(refData.monthRangeStt, containerRef.value?.getElement('monthRangeStt')) &&
await required(refData.monthRangeEnd, containerRef.value?.getElement('monthRangeEnd')) &&
await required(refData.monthRangeSttStt, containerRef.value?.getElement('monthRangeSttStt')) &&
await required(refData.monthRangeEndEnd, containerRef.value?.getElement('monthRangeEndEnd')) &&
await required(refData.select, containerRef.value?.getElement('select')) &&
await required(refData.textarea, containerRef.value?.getElement('textarea'))
false
console.log('requiredRefTargetLabel result = ', result)
console.groupEnd()
}