input 에 텍스트를 입력하고 엔터를 누르면 태그가 추가되도록 하는 기능을 만드는 중에, 한글을 입력 할 시 마지막 글자가 따로 추가되는 현상이 발생했다.
이를 수정하기 위해 구글링을 해보았고, 아래의 블로그에 정리가 잘 되어 있어 참고했다.
https://velog.io/@corinthionia/JS-keydown에서-한글-입력-시-마지막-음절이-중복-입력되는-경우-함수가-두-번-실행되는-경우
onKeyPress
를 사용하면 해결되는 문제라고 한다.@deprecated
라고 표시되므로, 다른 방법을 사용해 처리 할 것이다.@deprecated
: 더 이상 사용되지 않는다.onKeyUp
, onKeyDown
, onKeyPress
가 가장 대표적이다.<input
type="text"
onKeyDown={(e) =>
console.log(
'event : onKeyDown',
'/ key :',e.key,
'keyCode :',e.keyCode,
'charCode :',e.charCode
)
}
onKeyUp={(e) =>
console.log(
'event : onKeyUp',
'/ key :',e.key,
'keyCode :',e.keyCode,
'charCode :',e.charCode
)
}
onKeyPress={(e) =>
console.log(
'event : onKeyPress',
'/ key :',e.key,
'keyCode :',e.keyCode,
'charCode :',e.charCode
)
}
/>;
→ 입력된 키와 keyCode
, charCode
를 출력하는 코드이다.
onKeyUp
과 onKeyDown
은 keyCode
를 감지하고, onKeyPress
는 ASCII
코드를 감지한다.onKeyUp
과 onKeyDown
는 keyCode
값은 불러오지만, charCode(ASCII)
값은 0으로 처리한다.onKeyPress
는 charCode
값을 불러오고, keyCode
를 0으로 처리한다.onKeyPress
의 경우 ASCII
코드에 포함되지 않은 키들(Meta, Backspace, 방향키, Shift, Ctrl, Alt 등…)은 감지해내지 못한다.→ 즉, onKeyPress
를 사용하면 조합된 일부 키입력을 사용 할 수가 없다.
onKeyPress
: 키가 눌렸을 때 실행 됨onKeyDown
: 키가 눌려있는 동안 실행 됨onKeyUp
: 키를 눌렀다가 떼면 실행 됨.composition session
이 실행 중인지 아닌지를 감지하여 그 결과를 Boolean 값으로 반환하는 프로퍼티이다.false
인 경우를 조건문에 추가함으로써 composition session
이 종료된 뒤에 값을 추가하므로, 중복 이벤트 실행 문제를 해결 할 수 있다.const addKeyword = (e: React.KeyboardEvent<HTMLInputElement>) => {
if (
keywordValue &&
!keywords.includes(keywordValue) &&
e.key === 'Enter' &&
e.nativeEvent.isComposing === false // 요기
) {
setKeywords([...keywords, keywordValue]);
setKeywordValue('');
}
};
keyCode
도 사용되지 않으며, key
를 사용한다.key
를 지원을 하지 않는 브라우저가 있다고 하니 참고만 해두자.syntheticEvent
는 리액트가 모든 브라우저에서 이벤트를 처리할 수 있게끔 전달하는 객체이다.nativeEvent
는 브라우저 고유의 이벤트를 이야기하며, syntheticEvent
는 이를 래핑하여 전달하는 역할을 한다.nativeEvent
를 통해 리액트를 통해 래핑되지 않은 이벤트 프로퍼티, 메소드에 접근 할 수 있다.