[英]Defining a function inside a template literal
我正在使用样式组件作为 React 样式的解决方案。 他们有一个很好的方法,使用模板文字来插入 CSS。 模板文字通过组件的 props 传递,以便您可以执行以下操作:
const PasswordsMatchMessage = styled.div`
background: ${props => props.isMatching ? 'green' : 'red'};
`
结果是一个组件,它根据isMatching
的值呈现带有绿色或红色背景的div
标签。 以上将通过 JSX 使用,如下所示:
<PasswordsMatchMessage isMatching={doPasswordsMatch}>...</PasswordsMatchMessage>
每次props
的值发生变化时,这个字符串都会被重新插入。 这最终让我想到了我的问题:
每次插入模板文字时,模板文字中定义的箭头函数是否都会重新定义?
如果是这样,那么我可能会考虑在模板文字之外创建函数并将它们传入,例如
const PasswordsMatchMessage = styled.div`
background: ${isMatchingFn};
`
是的,每次插入模板文字时,它都会定义一个新版本的函数。 您可以通过定义自己的跟踪先前值的标记来验证这一点。
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'
,因为正在重用函数引用。
不过在这种情况下,我不会太担心性能影响,除非您确实注意到速度变慢,否则请选择更具可读性的内容。 与重新渲染 div 相比,创建新函数的开销不太可能很高。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.