이벤트 객체의 target과current Target의 차이점 및 관련 Type Script의 행동을 조사했습니다.
16512 단어 HTMLJavaScriptReactTypeScriptWebtech
갑작스럽게
event.target
와event.currentTarget
는 어떻게 구분해서 사용합니까?원래 차이가 있나요?그렇게 생각할지도 몰라.
단도직입적으로 말하면 매우 많다.사용 방법에 따라 오류가 발생할 수밖에 없다.그나저나 내 상황이 생겼어.(두 시간 정도 걸려서 디버깅한 건 또 다른 말)
오늘은 두 속성의 차이점과 Type Script에 미치는 영향에 대해 살펴보겠습니다.
웹 API의 사양입니다. React와 관계없이 참조 코드는 React입니다.
쓰여 있다.
예를 들어 다음과 같은 코드가 있다고 가정해 보세요.
function App() {
const onClick = (e) => {
console.log(e.target);
console.log(e.currentTarget);
};
return (
<button onChange={onClick}>
<strong>Click me</strong>
</button>
);
}
언뜻 보면 수출이 같은 요소라고 생각하기 쉬우나 실제로는 다르다.console.log(e.target); // <strong>Click me</strong>
console.log(e.currentTarget); // <button>...</button>
는 위에서 말한 바와 같이 e.target
는strong요소이고 e.currentTarget
는button요소이다.왜냐하면, 여기.에 기재된 바와 같이
e.target
는 사건 발생의 원인e.currentTarget
는 이벤트 처리 프로그램이 실제적으로 부여된 요소그래서
이것을 잘 이해하려면 가동 용수철의 구조를 알아야 한다.
쉽게 말해 사건 발생 후 바로 위 부모 요소로 옮겨 같은 일을 하다가 맨 위
<html />
에 도달할 때까지 반복하는 메커니즘이다.이것을 마음에 두고
target
와currentTarget
의 출력 결과를 다시 한 번 보세요.이것이야말로 아하의 체험이지, 나한테는 잘 어울려.
실제 클릭의 요소(사건 발생을 초래하는 요소)는strong 요소입니다.
활동의 기본 요소(사건 처리 프로그램이 실제적으로 부여된 요소)는 button 요소이다.
그러게 말이야.
그리고 왜 사용
e.target
하면 버그가 발생하기 쉬운지도 아까 설명한 주요 원인과 관련이 있다.예를 들어 위의 코드로 button 요소를 지정하려면strong 요소를 지정한다.
그러니까 확실성이 없다는 거야.
그래서 나는 이 글에서 가능한 한 사용하라고 말하고 싶다
e.currentTarget
.TypeScript
또한
e.currentTarget
를 사용해도 타입 스크립트의 혜택을 받을 수 있다.예를 들어 다음과 같은 코드가 있다고 가정해 보세요.
function App() {
const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {
// 通る
console.log(e.currentTarget.value);
// エラー
console.log(e.target.value);
}
return (
<button onClick={handleClick}>
<strong>Click me</strong>
</button>
);
활동 유형을 잘 설정했어도e.target.value
Property 'value' does not exist on type 'EventTarget'
이렇게 혼났어요.(여기는
const value = e.target as HTMLButtonElement
이런 역할 분배, 이런 모델은 비교적 흔하다)왜냐하면, 방금 말한 바와 같이
e.target
는 사건 발생의 원인이다따라서 Type Script에서는 어떤 요소가 기원인지 알 수 없습니다.
// 例:
function App() {
return (
<button>
<span>
<span>
<strong>...</strong>
{/* ここがイベント発生源だったとしても、TypeScript はわからないので自分でキャストする必要がある */}
</span>
</span>
</button>
);
}
,e.currentTarget
예실제 권한 부여된 이벤트 처리 프로그램 요소
따라서 Type Script에서 올바른 서식이 적용된 정보는currentTarget로 이해할 수 있습니다.
번거로운 배역이 필요 없다는 얘기다.
덤
target과current Target로 게임을 많이 하다가 불가사의한 행동을 당했어요.
코드는 다음과 같습니다.
export default function App() {
const [name, setName] = React.useState("");
function handleSetName(e: React.ChangeEvent<HTMLInputElement>) {
// 通る
console.log(e.currentTarget.classList);
// これもなぜか通る???
console.log(e.target.classList);
}
return (
<form onSubmit={(e) => console.log(e)}>
<input value={name} onChange={handleSetName} />
<button type="submit">Submit</button>
</form>
);
}
온체인지의 활동은 모두 활동해야 하는데 왜 인풋의 온체인지만 허용되는 걸까.다방면의 조사를 거쳐 여기. 이유를 진술하였다.
onChange 프로세서는 e.target과 행동이 다릅니다. 이벤트 프로세서가 등록의 요소가 되는 것을 보장하기 때문에 문제가 없습니다.
듣건대
실제로
react.d.ts
보면// index.d.ts:1153
interface ChangeEvent<T = Element> extends SyntheticEvent<T> {
target: EventTarget & T;
}
는 MouseEvent
와 다른 T가 지정한 요소형을 target에 연결하여 채웁니다.에이~
참고로 다른 프레임워크가 유형을 어떻게 정의하는지 몰라요!
끝까지 읽어주셔서 감사합니다~
Reference
이 문제에 관하여(이벤트 객체의 target과current Target의 차이점 및 관련 Type Script의 행동을 조사했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/yuyao17/articles/e0a54bd14ead9b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)