在模板文字中定义函数
Defining a function inside a template literal
我正在使用 styled-components 作为 React 样式的解决方案。他们有一个很好的方法,使用模板文字来插入 CSS。模板文字被传递给组件的道具,这样你就可以做这样的事情:
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'
,因为正在重用函数引用。
不过在这种情况下,我不会太担心性能影响,除非您确实注意到速度变慢,否则请选择更易读的内容。与 re-rendering 和 div 相比,创建新函数的开销不会很高。
我正在使用 styled-components 作为 React 样式的解决方案。他们有一个很好的方法,使用模板文字来插入 CSS。模板文字被传递给组件的道具,这样你就可以做这样的事情:
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'
,因为正在重用函数引用。
不过在这种情况下,我不会太担心性能影响,除非您确实注意到速度变慢,否则请选择更易读的内容。与 re-rendering 和 div 相比,创建新函数的开销不会很高。