refactor: QInput 컴포넌트 type text로 통일, 숫자 유효성 검사 수정
This commit is contained in:
parent
c0bf5e8a2d
commit
4cad5cfd50
@ -39,7 +39,7 @@ export default function Playground() {
|
|||||||
const [color, setColor] = useState('#ff0000')
|
const [color, setColor] = useState('#ff0000')
|
||||||
|
|
||||||
const [textInput, setTextInput] = useState('')
|
const [textInput, setTextInput] = useState('')
|
||||||
const [numberInput, setNumberInput] = useState(null)
|
const [numberInput, setNumberInput] = useState('')
|
||||||
const [radioInput, setRadioInput] = useState('')
|
const [radioInput, setRadioInput] = useState('')
|
||||||
const [checkboxInput, setCheckboxInput] = useState([])
|
const [checkboxInput, setCheckboxInput] = useState([])
|
||||||
const [selectedValue, setSelectedValue] = useState('')
|
const [selectedValue, setSelectedValue] = useState('')
|
||||||
@ -171,7 +171,7 @@ export default function Playground() {
|
|||||||
<button
|
<button
|
||||||
className="btn-frame deepgray"
|
className="btn-frame deepgray"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setNumberInput(null)
|
setNumberInput('')
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
QInput NumberInput DATA RESET
|
QInput NumberInput DATA RESET
|
||||||
|
|||||||
@ -1,8 +1,9 @@
|
|||||||
'use client'
|
'use client'
|
||||||
|
|
||||||
import { useCallback } from 'react'
|
import { useCallback, useState } from 'react'
|
||||||
|
|
||||||
export default function QInput({ type, className, ref, id, readOnly = false, options = [], placeholder, value, onChange }) {
|
export default function QInput({ type, className, ref, id, readOnly = false, options = [], placeholder, value, onChange }) {
|
||||||
|
const [prevNum, setPrevNum] = useState('')
|
||||||
// options = options || [
|
// options = options || [
|
||||||
// {
|
// {
|
||||||
// id: 'one',
|
// id: 'one',
|
||||||
@ -35,51 +36,59 @@ export default function QInput({ type, className, ref, id, readOnly = false, opt
|
|||||||
|
|
||||||
const handleTextNumberChange = useCallback(
|
const handleTextNumberChange = useCallback(
|
||||||
(e) => {
|
(e) => {
|
||||||
if (type === 'text') {
|
onChange(e.target.value)
|
||||||
onChange(e.target.value)
|
|
||||||
} else if (type === 'number') {
|
|
||||||
onChange(Number(e.target.value))
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
[type, onChange],
|
[onChange],
|
||||||
)
|
)
|
||||||
|
|
||||||
// type=number 정수 부호, 소수점 검사, 일부 키 허용
|
// type=number 정수 부호, 소수점 검사, 일부 키 허용
|
||||||
|
// const checkInputNumber = (e) => {
|
||||||
|
// const value = e.target.value
|
||||||
|
// const key = e.key
|
||||||
|
// const allowKeys = ['Backspace', 'Delete', 'ArrowLeft', 'ArrowRight', 'Home', 'End', 'Tab', 'Enter', 'Control'] // 'ArrowUp', 'ArrowDown',
|
||||||
|
// if (key >= '0' && key <= '9') {
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
// if (key === '.' && !value.includes('.') && value.length > 0 && !isNaN(Number(value))) {
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
// if (key === '-' && !value.includes('-') && value.length > 0) {
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
// if (allowKeys.includes(key)) {
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
// if (key === 'a' || key === 'c' || key === 'v' || key === 'x' || key === 'z') {
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
// e.preventDefault()
|
||||||
|
// }
|
||||||
|
// type=number 정수 부호, 소수점 검사
|
||||||
const checkInputNumber = (e) => {
|
const checkInputNumber = (e) => {
|
||||||
const value = e.target.value
|
const value = e.target.defaultValue
|
||||||
const key = e.key
|
if (value === '') return
|
||||||
const allowKeys = ['Backspace', 'Delete', 'ArrowLeft', 'ArrowRight', 'Home', 'End', 'Tab', 'Enter', 'Control'] // 'ArrowUp', 'ArrowDown',
|
|
||||||
if (key >= '0' && key <= '9') {
|
const regex = /^-?([1-9]\d*|\d)(\.\d*)?$/
|
||||||
return
|
if (regex.test(value)) {
|
||||||
|
setPrevNum(value)
|
||||||
|
} else {
|
||||||
|
onChange(prevNum)
|
||||||
}
|
}
|
||||||
if (key === '.' && !value.includes('.') && value.length > 0 && !isNaN(Number(value))) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (key === '-' && !value.includes('-') && value.length > 0) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (allowKeys.includes(key)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (key === 'a' || key === 'c' || key === 'v' || key === 'x' || key === 'z') {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
e.preventDefault()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// input type : text, number
|
// input type : text, number
|
||||||
const inputTextNumber = () => {
|
const inputTextNumber = () => {
|
||||||
return (
|
return (
|
||||||
<input
|
<input
|
||||||
type={type}
|
type="text"
|
||||||
className={`input-light ${className ? className : ''}`}
|
className={`input-light ${className ? className : ''}`}
|
||||||
ref={ref}
|
ref={ref}
|
||||||
id={id}
|
id={id}
|
||||||
readOnly={readOnly ? true : false}
|
readOnly={readOnly ? true : false}
|
||||||
placeholder={placeholder}
|
placeholder={placeholder}
|
||||||
value={value === 0 ? 0 : value || ''}
|
value={value}
|
||||||
onChange={handleTextNumberChange}
|
onChange={handleTextNumberChange}
|
||||||
onKeyDown={type === 'number' ? checkInputNumber : undefined}
|
onKeyUp={type === 'number' ? checkInputNumber : undefined}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user