onClick 핸들러에서 매개 변수를 전달하는 가장 좋은 방법


11

이것은 onClickdiv 의 경로를 변경하기 위해 인라인 화살표 기능을 사용하는 구성 요소 이지만 성능면에서 좋은 방법은 아니라는 것을 알고 있습니다

1. 인라인 화살표 기능

changeRoute (routeName) {
  console.log(routeName)
}
render() {
  return (
    <>
      <div onClick={() => this.changeRoute("page1")}>1</div>
      <div onClick={() => this.changeRoute("page2")}>2</div>
    </>
  )
}

2. 생성자 바인딩을 사용하는 경우 소품을 어떻게 전달할 수 있습니까?

constructor() {
  super(props)
  this.changeRoute = this.changeRoute.bind(this)
}
changeRoute (routeName) {
  console.log(routeName)
}
render() {
  return (
    <>
      <div onClick={this.changeRoute}>1</div>
      <div onClick={this.changeRoute}>2</div>
    </>
  )
}

3. 화살표 함수를 제거하면 렌더 자체에서 호출되는 함수

changeRoute (routeName) {
  console.log(routeName)
}
render() {
  return (
    <>
      <div onClick={this.changeRoute("page1")}>1</div>
      <div onClick={this.changeRoute("page2")}>2</div>
    </>
  )
}

4. 인라인 바인딩을 사용하면 성능이 좋지 않습니다.

changeRoute (routeName) {
  console.log(routeName)
}
render() {
  return (
    <>
      <div onClick={this.changeRoute.bind(this, "page1")}>1</div>
      <div onClick={this.changeRoute.bind(this, "page2")}>2</div>
    </>
  )
}

그렇다면 매개 변수를 전달하는 가장 좋은 방법은 어떻게 진행할 수 있습니까?


그것은 것을주의 아마 가치가 이유 화살표 기능을 어떻게 든 그렇지 않은 것 (실행에 본질적으로 느린 것 때문에 여기에 기능을 화살표 인라인 사용하는 이유가되지 않는다 "성능면에서 [A] 좋은 방법이 아니다", 그리고 어떤 경우에 함수 호출 비용은 클릭 핸들러처럼 거의 실행되지 않는 것으로는 거의 무시할 수 있지만) React는 컴포넌트를 다시 렌더링 할 때마다 함수의 새 인스턴스를 작성하기 때문입니다. 인라인 바인딩에는 동일한 문제가 있습니다. 그리고 구성 요소가 매우 자주 다시 렌더링되지 않는 한 일반적으로 좋습니다 .
Ilmari Karonen

2
@IlmariKaronen 대부분의 경우 구성 요소에 입력 필드가 있고 상태에서 e.target.value를 입력 및 설정하면 구성 요소가 자주 렌더링됩니다.
다크 나이트

답변:


6

화살표 함수를 사용하여 changeRoute처리기 를 정의 할 수 있습니다 .

이것은로 알려져 있습니다 Class field syntax. 공식 반응 문서에서 여기 에 더 자세히 설명되어 있습니다 .

constructor() {
  super(props)
}

const changeRoute = (parameter) => (event) => {
    // business logic for route change.
}

그런 다음이 기능을 다음과 같이 직접 사용할 수 있습니다.

render() {
  return (
    <>
      <div onClick={changeRoute(params1)}>1</div>
      <div onClick={changeRoute(params2)}>2</div>
    </>
  )
}

바인딩에 대해 걱정할 필요가 없습니다. 화살표 함수는 부모의을 상속합니다 this.


@DarkKnight 마지막 의견은 executing on the go입니다. 내 대답은 그에 대한 답변입니다. 내가 execute on the go게시 한 것처럼 핸들러를 정의하면 클릭 핸들러가 작동하지 않는다고 말하려고합니다 .
Utsav Patel


@DarkKnight 다음 reactjs.org/docs/handling-events.html을 읽어보십시오. 클래스 필드 구문은 공식 반응 문서에서 권장하는 방법 중 하나입니다.
Utsav Patel

알겠습니다 감사합니다
다크 나이트

3

div에 데이터를 추가 할 수 있습니다 :

<div data-id={1} onClick={this.changeRoute}>1</div>

그런 다음 onClick 핸들러에서 해당 데이터를 검색 할 수 있습니다.

onClick = (event) => {
  const id = event.currentTarget.dataset.id;
}

훌륭한 접근 방식!
최대

하하하 ... 할 수 있습니다. 그러나 반응 자체는 해결되지 않았습니까?
다크 나이트

1

# 1 은 괜찮습니다.

# 2 도 '괜찮'지만 소품을 전달해야하는 경우 렌더링 함수는 정확히 # 1 과 같습니다 . bind생성자에서 대체했기 때문에 'd 함수를 호출합니다 .

렌더링하는 동안 함수가 호출되므로 # 3 은 잘못되었습니다.

그리고 # 4에 대해서는 반응 문서에서

이런 종류의 성능 문제를 피하려면 일반적으로 생성자에서 바인딩하거나 클래스 필드 구문을 사용하는 것이 좋습니다.

이로 인해 하위 구성 요소에서 함수를 사용하면 성능이 저하되고 하위 구성 요소가 다시 렌더링됩니다 (귀하의 경우는 아님). 따라서 # 4 하지 말아야합니다 .


1

현재 가장 좋은 방법은 이벤트 핸들러를 useCallback훅으로 감싸서 렌더링이 호출 될 때마다 핸들러 함수가 작성되지 않도록하는 것입니다.

import React, { useCallback } from 'react'

const MyComponent = ({ changeRoute }) => {
  const eventHandler = useCallback(() => {
    changeRoute('page1')
  }, [changeRoute])

  return (
    <div onClick={eventHandler}>1</div>
  )
}

자세한 정보 확인- 콜백 문서 사용


OP는 후크를 사용할 수없는 클래스 구성 요소를 사용하는 것으로 보입니다.
TJ Crowder

내 대답이 더 나은 방법을 이해하는 데 도움이되기를 바랍니다.
Aleh Atsman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.