我正在使用styled-components作为React样式的解决方案。他们有一个很好的方法,使用模板文字插入CSS。模板文字传递组件的道具,以便您可以执行以下操作:
const PasswordsMatchMessage = styled.div`
background: ${props => props.isMatching ? 'green' : 'red'};
`
结果是一个组件,根据div
的值,呈现带有绿色或红色背景的isMatching
标记。以上将通过JSX使用,如下所示:
<PasswordsMatchMessage isMatching={doPasswordsMatch}>...</PasswordsMatchMessage>
每次props
的值发生变化时,都会重新插入此字符串。这最终让我想到了我的问题:
每次插入模板文字时,是否会重新定义模板文字中定义的箭头函数?
如果是这样,那么我可以考虑在模板文字之外创建函数,然后只传递那些函数,例如
const PasswordsMatchMessage = styled.div`
background: ${isMatchingFn};
`
答案 0 :(得分: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'
,表明它每次都在创建一个新函数。
将其与此版本进行比较:
trackInterpolations`background: ${isMatchingFn};`
第一次运行时,它会评估为'Got a different function'
(因为它尚未看到isMatchingFn
),但如果再评估几次,它将始终生成'Got the same function'
1}},因为函数引用正被重用。
虽然在这种情况下,我不会过分担心性能影响,除非你真的注意到减速,否则请使用更具可读性的内容。与重新渲染div相比,创建新函数的开销可能不会很高。