2017-05-14 14 views
3

今日は新しいリンターを使用して開始(tslint反応し)、それは私に次のような警告を与えている:JSX属性のLambdaはアンチパターンですか?

私はこの原因ことを得る

「ラムダは、そのレンダリングパフォーマンスへの影響にJSXの属性禁じられています」各レンダリングで作成される新しい関数。また、子コンポーネントはそれが変更された小道具だと思うので、不要な再レンダリングを引き起こす可能性があります。

しかし、私の質問はこれです、どのように他することができますループ内のイベントハンドラに1つのパスパラメータ:

customers.map(c => <Btn onClick={() => this.deleteCust(c.id) } />); 

答えて

11

絶対にありませんアンチパターン。

ラムダ(矢印機能)は、レンダリングのパフォーマンスに影響を与えません。

影響があるのはshouldComponentUpdateの実装だけです。この関数はデフォルトでtrueを返します。つまり、コンポーネントは常にレンダリングされます。これは、たとえ小道具が変わらなくても、コンポーネントはまだレンダリングされていることを意味します。それがデフォルトの動作です。

shouldComponentUpdateを実装していない場合、矢印関数をバインドされたメソッドに変更しても、パフォーマンスは向上しません。

矢印機能を使用しないとshouldComponentUpdateの実装を簡略化でき、PureComponentでは使用しないでくださいが、反パターンではありません。彼らは多くのパターンを単純化することができます。関数に追加のパラメータを追加するとき(たとえば、あなたの例で何をしているか)

ReactにはshouldComponentUpdateも実装できないステートレスコンポーネントがあり、常にレンダリングされることにも注意してください。

実際にパフォーマンスの問題が見つかるまで、パフォーマンスの影響は考慮しないでください。

+0

レンダリングと実際のDOM突然変異との間には違いがあります。なぜなら、レンダリングの結果が以前と同じであれば、反応調整はDOMに触れないからです。しかし、矢印関数を使用する場合、レンダリングの結果は同じではないため、DOMの突然変異が発生します。 –

+1

@Koen。 DOMを更新するときに 'onClick'ハンドラがカウントするとは思いません。 Reactは、合成されたイベントを持つ抽象レイヤーを持つため、関数をDOMに直接バインドしません。したがって、DOMを変更しないため、関数の変更はDOMに影響を与えません。 – Sulthan

+0

ああ、意味がある。 –

関連する問題