강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

김지원님의 프로필 이미지
김지원

작성한 질문수

[리뉴얼] React로 NodeBird SNS 만들기

이벤트 위임이 되는 것 같은데 될 이유가 없어보입니다

작성

·

249

0

이 코드에 있는 input에서 입력하고 엔터를 입력하면 이벤트 위임이 되는 듯 등록이 두번됩니다. 그래서  e.stopPropagation();  를 이용하여 해결하려 했는데 여전히 입력이 두번씩 됩니다.. 이게 제일 최하위 컴포넌트인데 도저히 에러를  못잡겠어서 질문드립니다. 심지어 e.target.value=""로 마지막에 입력값을 지우는 코드를 집어넣으면 첫 입력이 하크 였으면 뒤에글자인 크가 한번 더 입력됩니다. (첫번쨰 입력: 하크 두번쨰 입력: 크) 대체 왜이러는걸까요..?? 항상 답변 잘 해주셔서 감사합니다 제로초님

return (
<TodoTagDiv>
<TagTextInput>
<input
onKeyDown={onInputTag}
ref={tagNameInput}
placeholder='태그 이름과 배경색 글자색을 입력하시고 엔터를 눌러주세요!'
/>
<div>
{tags.map((item) => (
<span key={item.id}>{item.tagName}</span>
))}
</div>
</TagTextInput>
<ColorDiv>
<Input value={tagBGColor} onChange={onChangeTagBGColor} type='color' bordered={false} />
<span>배경색</span>
</ColorDiv>
<ColorDiv>
<Input value={tagTextColor} onChange={onChangeTagFontColor} type='color' bordered={false} />
<span>글자색</span>
</ColorDiv>
</TodoTagDiv>
);
const onInputTag = useCallback(
(e) => {
e.stopPropagation();
e.nativeEvent.stopImmediatePropagation();
if (e.key === 'Enter' && e.target.value) {
e.preventDefault();
console.log(e.target.value);
setTagName(e.target.value);
onChangeTags({
id: uuid(),
createdAt: new Date(),
tagName: tagName,
tabBGColor: tagBGColor,
tagTextColor: tagTextColor,
});
}
},
[tagName, tagBGColor, tagTextColor, onChangeTags]
);

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

음, 해당 태그가 form 태그 안에 있나요? 또한 키보드를 입력할 때 onKeyDown이나 이런 게 두 번씩 실행되나요? input을 저렇게 쓰는 방식은 제가 익숙한 방식이 아니라서 잘 모르겠습니다. 저는 value랑 onChange를 state 연결하는 controlled 방식만 써서요.

김지원님의 프로필 이미지
김지원
질문자

네 form 태그 안에 있습니다. 키보드를 입력할떄는 onkeydown이벤트밖에 실행이 안됩니다.. 

저도 제로초님이 말씀하신 value랑 onchange를 컨트롤하는 방식이 편한데 엔터키를 이용한 이벤트를 주고 싶은데 그냥 onChange에서 입력키를 다루는 게 좋을까요?

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

value랑 onChange를 쓰면 값이 state에 등록되니까, onKeyDown에서는 그 state를 쓰시고 e.target.value를 쓰지 마세요.

그리고 혹시 enter 입력할 때 form의 onSubmit도 실행되는건 아니죠?

김지원님의 프로필 이미지
김지원
질문자

그리고 혹시 enter 입력할 때 form의 onSubmit도 실행되는건 아니죠?

e.preventDefault()로 막아놓았습니다. 혹시 이게 문제를 발생시킬 수 있나요? 

value랑 onChange를 쓰면 값이 state에 등록되니까, onKeyDown에서는 그 state를 쓰시고 e.target.value를 쓰지 마세요.

이렇게 해보겠습니다

김지원님의 프로필 이미지
김지원
질문자

value랑 onChange를 쓰면 값이 state에 등록되니까, onKeyDown에서는 그 state를 쓰시고 e.target.value를 쓰지 마세요.

이렇게 해도 두번씩 입력되는 문제는 반복됩니다. 상위 컴퍼넌트에서 props로 주는 onChange를 onKeydown에서 쓰고 있는데 이걸로 문제가 발생할수도 있을까요?

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

e.preventDefault()로 막는게 맞는 것 같습니다.

혹시 맥 같은 거 쓰시나요? 한글 입력 관련 버그는 아니죠? onKeyDown 떼어내고 value랑 onChange만 있을 때는 두번씩 입력도는 현상이 나타나나요?

김지원님의 프로필 이미지
김지원
질문자

맥쓰고 있긴합니당

아뇨 onkeydown없으면 안나타납니다! 

의심되는 건 currntvalue를 지웠을 때는 뒤에문자하나만 두번째로 입력되는건데 value가 맘대로 의도한바와 다르게 움직이는 것 같습니다

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

그러면 keydown이 원인인건 맞네요. 거기서 코드를 하나씩 주석처리해서 원인을 찾아보세요.

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

폼이 원치않을때 리렌더링되면서 글자가 두 번 쳐질 수 있습니다.

김지원님의 프로필 이미지
김지원
질문자

keyPress로 바꿔서 해결했습니다 ㅎㅎ keydown이 왜 그런지는 사실 아직 못찾았습니다...

김지원님의 프로필 이미지
김지원

작성한 질문수

질문하기