- 만들고 싶은 기능 -
> text 타입의 input 컴포넌트에 숫자만 입력하도록 하기
- 방법 구상하기 -
> input 컴포넌트의 value 에 넣어주는 값을 다른 변수 val와 바인딩해 둔다.
> input 컴포넌트에 onChange 이벤트를 걸어둔다.
> onChange 이벤트 리스너에 조건문 처리를 해준다.
입력한 값이 숫자일 때는 value 와 바인딩해 두었던 변수 val 의 값을 수정하고,
숫자가 아닐 때에는 a 의 값을 수정하지 않고 그대로 둔다.
- 구현하기 -
<Input
type={"text"}
name={"myKey}
value={myData.myKey}
onChange={this.onChangeInputNum}
/>
onChangeInputNum(e, ele) {
// 숫자만 포함하는 정규식 생성
const reg = new RegExp('^\\d+$');
// 다 지우고 마지막 숫자까지 지우면 그때 value 는 공백 문자열 "" 가 됨.
// 이 "" 는 정규식에서 숫자로 인식하지 않으므로 정규식 조건을 만족하지 못함.
// 따라서 숫자를 모두 지웠을 때도 정규식을 만족할 수 있도록 공백 문자열 "" 일 경우 숫자 0으로 바꿔줌.
const val = ele.value === "" ? 0 : ele.value;
// value 가 정규식 조건에 부합하는지 확인
const isNum = reg.test(val);
// 정규식을 만족한다면? 즉, 숫자라면?
if(isNum) {
// value 가 바인딩되어 있는 데이터 객체 myData 에서 "myKey" 의 값을 val 로 업데이트함.
this.setMyDataProps(ele.name, val);
}
}
- 정규식 선언할 때 주의 -
대상에 숫자만 들어 있는지 확인하는 정규식은 아래와 같다.
const reg = /^\d+$/;
위 정규식에서는 "\"가 하나지만
이 식을 정규식 객체로 생성할 때는 아래처럼 "\\" 두 개로 해줘야 한다.
const reg = new RegExp('^\\d+$');
그 이유는 escaping 처리 때문이다.
RegExp() 함수를 보면 정규식 조건을 문자열 형태로 전달해주고 있다.
따라서 문자열 안에서 "\" 부분을 "\\" 처럼 escaping 처리 해주는 것이다.
escaping 처리를 해준 const reg = new RegExp('^\\d+$'); 는 결국 아래와 같다.
const reg = /^\d+$/; // 숫자 데이터만 들어갈 수 있음.
escaping 처리를 해주지 않은 const reg = new RegExp('^\d+$'); 는 결국 아래와 같은 의미다.
const reg = /^d+$/; // 문자열 알파벳 "d" 만 들어갈 수 있음.
- 230224 -
'JavaScript' 카테고리의 다른 글
[JavaScript] 목록 채우기 - 퍼블리싱이 적용된 템플릿을 복사하여 채우기 (0) | 2025.01.30 |
---|---|
[JavaScript] XMLHttpRequest 로 URL 호출해서 팝업창 띄우기 (0) | 2025.01.30 |
[JavaScript] 문자열을 그대로 html 태그로 DOM에 추가하고 싶을 때 (0) | 2023.01.16 |
[JavaScript] 값이 null 일 경우 parameter 에 key 조차 존재하면 안 될 때 (0) | 2023.01.09 |
[JavaScript] concat() 함수 사용법 / 변이 (mutation) 함수 (0) | 2022.12.26 |