2017-10-24 19 views
0

インデックスを渡しながら関数を呼び出そうとしていますが、ラムダをonclickハンドラに渡すのはベストプラクティスではありません。これを処理するより良い方法はありますか?今は毎回作成される関数ではないからですか?関数を呼び出してマップ関数からパラメータを渡す方法

ラムダの削除トランジション中に状態を更新するリスクがあります。トランジション中に関数が無限に呼び出される可能性があります。

class MyComponent extends React.Component { 
     constructor(props, context) { 
      super(props, context); 

      this.myFunc= this.myFunc.bind(this); 
     } 

      myFunc(index){ 
       //do stuff with the index 
      } 

      render(){ 
       const items = this.props.list.map((listItem, index) => 
        return <div key={listItem.id} onClick={() => this.myFunc(index)}>{listItem.name}</div> 
       ); 

       return(
        <div>{items}</div> 
       ) 
      } 
     } 
+0

'のonClick = {this.myFunc(インデックス)} ' –

答えて

1

それを行うための最善の方法は、新しいコンポーネントにリスト項目を抽出することである。

class ListItem extends React.PureComponent{ 
    const myFunc =() => { 
     const { index } = this.props 
     // do something with index 
    } 

    render(){ 
     const { listItem } = this.props 
     return (
      <div key={listItem.id} onClick={this.myFunc}>{listItem.name}</div> 
    ) 
    } 
} 
+0

はいこれを達成するもう1つの良い方法ですが、これはパフォーマンス面ではそれほど優れていません。より高価な複数のComponentインスタンスでバインドを置き換えています。 –

+0

アプリに依存します。ご覧のように、これはPureComponentであり、純粋なコンポーネントをレンダリングすることは何度も何度も関数を作成するよりも安価です –

0

It is recommended in the React Docs to use bind to pass additional params

myFunc(index, e){ 
    // Do something with index... 
} 
render() { 
    const items = this.props.list.map((listItem, index) => 
     return <div key={listItem.id} onClick={this.myFunc.bind(this, index)}>{listItem.name}</div> 
    ); 
    return ... 
} 
+0

実際には.bindもパフォーマンスが悪いです。https://stackoverflow.com/questions/8656106/why-is-function-prototype-bind-slowを参照してください。 –

+0

@AlexanderVitanov [これは反応の推奨方法です](https://reactjs.org/docs/handling-events.html#passing-arguments-to-event-handlers)。パフォーマンスヒットは、ほとんどのアプリでは目立たないはずです。 –

+0

矢印機能の影響はほとんどのアプリでは目立たない –

関連する問題