React onClick-매개 변수로 이벤트 전달


93

매개 변수없이

function clickMe(e){
  //e is the event
}

<button onClick={this.clickMe}></button>

매개 변수로

function clickMe(parameter){
  //how to get the "e" ?
}
<button onClick={() => this.clickMe(someparameter)}></button>

나는 event. 어떻게받을 수 있습니까?

답변:


166

이 시도:

<button onClick={(e) => {
     this.clickMe(e, someParameter)
}}>Click Me!</button>

그리고 당신의 기능에서 :

function clickMe(event, someParameter){
     //do with event
}

2
이로 인해 eslint 오류가 발생했습니다 ( eslint.org/docs/rules/arrow-parens.html ) 내가 한 일은 함수 매개 변수를 괄호로 onClick={(e) => { this.clickMe(e, someparameter) }}
묶었습니다

1
예 @kretzm 중괄호를 사용하지 않으면 한 줄일 때 반환 표현식으로 작동합니다. 그렇지 않으면 중괄호를 사용하여 함수 본문으로 래핑해야합니다.
Jyothi Babu Araja

4
권장하지 않는 구문이라고 덧붙이고 싶습니다. reactjs 문서에서 : 이 구문의 문제점은 버튼이 렌더링 될 때마다 다른 콜백이 생성된다는 것입니다. 대부분의 경우 괜찮습니다. 그러나이 콜백이 하위 구성 요소에 소품으로 전달되면 해당 구성 요소가 추가로 다시 렌더링 될 수 있습니다. 일반적으로 이러한 종류의 성능 문제를 방지하려면 생성자에서 바인딩하거나 클래스 필드 구문을 사용하는 것이 좋습니다. 에서 더 많은 정보 reactjs.org
northernwind

1
@승리자. 그래 네가 맞아. 그러나 콜백 내에서 부모의 컨텍스트를 원하면 렌더링 할 때마다 다른 콜백이 있어야합니다. 사실 그것은 제 생각에 트레이드 오프라고 생각합니다.
Jyothi Babu Araja

@JyothiBabuAraja 가장 좋은 해결책은 data-*HTML5 의 속성 을 활용하는 것입니다. 자세한 내용은 아래 내 답변을 참조하십시오.
Harry Chang

34

ES6를 사용하면 다음과 같이 더 짧은 방법으로 수행 할 수 있습니다.

const clickMe = (parameter) => (event) => {
    // Do something
}

그리고 그것을 사용하십시오 :

<button onClick={clickMe(someParameter)} />

이렇게하면 새로운 콜백 문제도 해결됩니까? stackoverflow.com/questions/42597602/...
오타니 주조에게

1
이 외에도 여러 매개 변수를 보낼 수 있습니다. const clickMe = (parameter1, parameter2) => (event) => {// 무언가를하십시오}
AhuraMazda

1
이것은 또한 구성 요소가 마운트 될 때 실행됩니다. 코드는 다음과 같아야합니다.onClick={(e) => clickMe(someParameter)(e)}
Alexander Kim

clickMe와 유사하게 이벤트를 삭제할 수도 있습니다. 심지어 u는 매개 변수로 정의하지 않아도됩니다.
Minh Kha

감사합니다. 효과가있다. 하지만 왜 const clickMe = (parameter) => (event) => {...} 대신 거기에const clickMe = (parameter) => {...} 있습니까?
zrna

16

해결책 1

function clickMe(parameter, event){
}

<button onClick={(event) => {this.clickMe(someparameter, event)}></button>

솔루션 2 bind 함수를 사용하는 것이 솔루션 1에서 화살표 함수 방식보다 더 나은 것으로 간주됩니다. 이벤트 매개 변수는 핸들러 함수의 마지막 매개 변수 여야합니다.

function clickMe(parameter, event){
}

<button onClick={this.clickMe.bind(this, someParameter)}></button>

이벤트 매개 변수가 솔루션 # 2의 마지막 항목 인 경우 +1. 내가 뭘 잘못하고 있는지 영원히 깨닫게되었고 문서 어딘가에서 그 이유를 놓친 것 같습니다.
abelito

5

새로운 콜백 생성 문제를 완전히 해결하려면 data-* HTML5 속성을 것이 최상의 솔루션 IMO입니다. 하루가 끝나면 매개 변수를 전달하기 위해 하위 구성 요소를 추출하더라도 여전히 새로운 기능을 생성합니다.

예를 들면

const handleBtnClick = e => {
  const { id } = JSON.parse(e.target.dataset.onclickparam);
  // ...
};

<button onClick={handleBtnClick} data-onclickparam={JSON.stringify({ id: 0 })}>

특성 사용에 대해서는 https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes 를 참조 하십시오data-* .


나는이 접근 방식을 좋아합니다. 간단하고 깨끗한
marknt15

5

ES6 예제를 사용한 커링 :

const clickHandler = param => event => {
  console.log(param); // your parameter
  console.log(event.type); // event type, e.g.: click, etc.
};

핸들러를 토글하는 버튼 :

<button onClick={(e) => clickHandler(1)(e)}>Click me!</button>

이벤트 객체없이이 함수 표현식을 호출하려면 다음과 같이 호출합니다.

clickHandler(1)();

또한 react는 합성 이벤트 (네이티브 이벤트에 대한 래퍼)를 사용하기 때문에 이벤트 풀링 이 있습니다. 즉, event객체를 비동기 적으로 사용하려면 event.persist()다음 을 사용해야합니다 .

const clickHandler = param => event => {
  event.persist();
  console.log(event.target);
  setTimeout(() => console.log(event.target), 1000); // won't be null, otherwise if you haven't used event.persist() it would be null.
};

다음은 실제 예입니다. https://codesandbox.io/s/compassionate-joliot-4eblc?fontsize=14&hidenavigation=1&theme=dark


왜 나는 아직도이 필요합니까 event.persist()함께 console.log(event)하지만 난 그것을 필요하지 않습니다 console.log(event.target)?
Isaac Pak


이러한 맥락에서 커링보다 2 개의 매개 변수를받는 일반 함수를 사용하는 것이 더 빠릅니다. jsben.ch에서 벤치 마크 테스트를 실행할 수 있습니다
ncesar

@ncesar jsben.ch에서 React를 어떻게 설정합니까? 테스트 plz를 게시하십시오.
Isaac Pak

@IsaacPak jsben은 자바 스크립트 코드를 테스트하는 간단한 도구입니다. 거의 두 가지 다른 코드 샘플을 배치하고 속도를 비교합니다. 전체 React 코드를 넣을 필요는 없으며, 느리다고 생각하고 테스트하고 싶은 함수 만 있으면됩니다. 또한 저는 항상 jsben.ch와 jsbench.me를 사용하여 확인합니다. clickHandler 컨텍스트에서 일부 코드를 모의 처리해야합니다. 마찬가지로 let event;이 정의되지 않은 오류가 발생 실 거예요 그래서.
ncesar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.