3

私はstyled-componentsをReactのスタイリングの解決策として使用しています。テンプレートリテラルを使ってCSSを補間する素晴らしい方法があります。あなたのようなことを行うことができるようにテンプレートリテラルは、コンポーネントの小道具を渡されます。 テンプレートリテラル内に関数を定義する

const PasswordsMatchMessage = styled.div` 
    background: ${props => props.isMatching ? 'green' : 'red'}; 
` 

結果はisMatchingの値に応じて、緑または赤の背景のいずれかでdivタグをレンダリングするコンポーネントです。上記のようにJSXを経由して使用することになります。

<PasswordsMatchMessage isMatching={doPasswordsMatch}>...</PasswordsMatchMessage> 

たびpropsの値が変化し、この文字列は、再補間されようとしています。最後に私の質問に私をもたらします:

テンプレートリテラルが定義されるたびに、テンプレートリテラル内で定義された矢印関数が再定義されますか?

もしそうなら、私はテンプレートリテラルの外で関数を作成し、それらを渡すことを検討するかもしれません。

+0

なぜ動作しないのか分かりません。あなたはそれをテストしましたか? –

+0

@KeithAそれは動作します、それは私の質問ではありません。ちょっと埋まってしまったので、質問を明確にするために私の投稿を編集しました;) – maxedison

+0

Hmmm。よく分かりません。あなたの質問には理由がありますか? –

答えて

5

はい、テンプレートリテラルが補間されるたびに、新しいバージョンの関数が定義されます。以前の値を追跡する独自のタグを定義することで、それを確認できます。

var previous; 
function trackInterpolations(literalParts, interpolated) { 
    if (interpolated === previous) { 
    answer = 'Got the same function'; 
    } else { 
    answer = 'Got a different function'; 
    } 
    previous = interpolated; 
    return answer; 
} 

その後

trackInterpolations`background: ${props => props.isMatching ? 'green' : 'red'};` 

を数回実行し、それは常に、それは新しい機能を毎回作成していますことを示す、'Got a different function'と評価されていることに気づきます。

このバージョンにすることを比較します。それを(それがまだisMatchingFnを見ていないので)

trackInterpolations`background: ${isMatchingFn};` 

それが実行しています初めて、それは'Got a different function'と評価されますが、あなたがそれを評価する場合にはさらに数回関数参照が再利用されているため、常に'Got the same function'になります。

この場合でもパフォーマンスの影響はあまり気にならないでしょうし、実際に減速に気付かない限り、読みやすくなるものはありません。 divを再レンダリングする場合と比較して、新しい関数を作成するオーバーヘッドはあまり高くありません。

+0

@Bergi oops、それをキャッチしてくれてありがとう:) –

+0

2番目の時間を実行しても「別の機能を持っています」と言うことを意味すると思います。関数は再定義されていないので、あなたの答えに矛盾しています。私もそれを試してみましたが、確かに、それは毎回異なる機能です:)。パフォーマンスのボトルネックに関しては、私は今それについて心配するつもりはありません。しかしこのようなテンプレートの文字通りの使い方は私にとっては新しく、何が起こっているのかを理解したかったのです。 – maxedison

+0

これは良い答えです! :) – mxstbr

関連する問題