2017-10-03 1 views
0

私は、コンポーネントがレンダリングされるたびに関数を再作成する必要があるため、悪い習慣と見なされる矢印関数イベントハンドラを持つ機能コンポーネントを持っています。矢印関数ハンドラを持つ機能コンポーネントは、パフォーマンスのために優れていて、コンストラクタにバインドされたハンドラを持つクラスコンポーネントですか?

const SimpleQuestion = ({ 
    question, 
    onChangeQuestionTitle 
}) => { 

    return (
    <div> 
     <input 
     type="text" 
     placeholder="Enter Question" 
     value={question.title} 
     onChange={(e) => onChangeQuestionTitle({ 
      id: question.id, 
      title: e.target.value 
     })} 
     /> 
    </div> 
); 
}; 

それは小道具にアクセスする必要があるように私は、それのために外部関数を定義することはできません、また私は、この例ではすべての利点を参照してください。

const SimpleQuestion = ({ 
    question, 
    onChangeQuestionTitle 
}) => { 

    const handleChangeQuestionTitle = (e) => { 
    onChangeQuestionTitle({ 
     id: question.id, 
     title: e.target.value 
    }); 
    }; 

    return (
    <div> 
     <input 
     type="text" 
     placeholder="Enter Question" 
     value={question.title} 
     onChange={handleChangeQuestionTitle} 
     /> 
    </div> 
); 
}; 

矢印機能の必要性を排除するために、私はクラスのコンポーネントを使用することができますコンストラクタとbind()を使用します。例:

class SimpleQuestion extends React.Component { 
    constructor(...args) { 
    super(...args) 
    this.onChangeQuestionTitle = this.onChangeQuestionTitle.bind(this); 
    } 

    render() { 
    return (
     <div> 
     <input 
      type="text" 
      placeholder="Enter Question" 
      value={question.title} 
      onChange={this.onChangeQuestionTitle} 
     /> 
     </div> 
    ); 
    } 

    onChangeQuestionTitle(e) { 
    this.props.onChangeQuestionTitle({ 
     id: question.id, 
     title: e.target.value 
    }); 
    } 
} 

私は矢印の機能を持つクラスのコンポーネントまたは機能コンポーネントを使用する必要がありますか?パフォーマンスの観点からはどちらが良いでしょうか?

PS:質問コンポーネントからロジックをエクスポートし、親コンテナ内でハンドラロジックを実行できることを知っていますが、この問題はパフォーマンストピックに関するものです。

ありがとう

+1

この質問はCodereview(https://codereview.stackexchange.com/) – ProEvilz

答えて

0

どちらかの方法が優先されます。どちらを選ぶべきかは、個人的な好みだと思います。私はあなたがコンストラクタでバインドする必要がないので、私は個人的に太い矢印の構文(#2)を好みます。しかしどちらの場合でも、関数への参照(関数定義ではなく)をrender()に渡すことで、不要な無名関数を作成する問題を解決しています。

+0

にあるべきだと私は思っています。前の回答のコメントで既に述べたように、私は2番目の配列関数は1つ目の例では、コンポーネント自体が再レンダリングが必要なたびに呼び出される純関数です。問題は、クラスとコンポーネントの状態とライフサイクル(パフォーマンスが低下する)を使用するか、コンポーネントが再レンダリングされるたびに機能コンポーネントとハンドラ関数の再初期化を使用すべきかどうかです。どのような変種がより優れた性能を持ち、その理由は? –

+0

私はあなたが最初のものと同じであることについてあなたが間違っていると信じていますが、あなたが参照を持っていれば間違っていることを自由に証明してください。私は明日の私の主張を支持する何かを見つけようとします –

+0

http://www.zsoltnagy.eu/container-components-and-stateless-functional-components-in-react/「コールバックのあるコンポーネントはどうですか? 「このアプローチの唯一の問題は、DOMがレンダリングされるたびにハンドラ関数が再作成されることです」と述べています。 –

0

あなたは一部のjsxを返す必要があり、コンポーネントの状態やライフサイクルの方法について気にしないので、最良のオプションは#2です。

関数への参照を関数自体のメソッドではなくrender()メソッドに渡すことで、不要な匿名関数を作成するという問題については解決します。

+0

#2と#1はハンドラ関数を同じ時間に初期化すると主張します。唯一の違いは#2ハンドラはJSXの外で定義されていますが、それでもコンポーネント自体は純粋な関数なので、毎回呼び出され、レンダリングが必要です。 #3の例では状態とライフサイクルがあり、パフォーマンスが低下すると考えています。ハンドラ関数の再初期化や再初期化を伴う機能コンポーネントを使用せずにクラスコンポーネントを使用する必要がありますか?魔女の1つは、パフォーマンスの観点から、より効率的なソリューションですか? –

+0

この場合、最善の選択肢は2番目です。より速くレンダリングされます。親コンポーネントの作業であるコンポーネントの状態に気にしないため、クラスベースのコンポーネントは必要ありません。 JSXの機能コンポーネントだけを返すことは、使用するのに最適なオプションです。 –

関連する問題