在模板文字中定义函数

时间:2017-01-31 21:49:12

标签: javascript reactjs ecmascript-6 template-literals styled-components

我正在使用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};
`

1 个答案:

答案 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相比,创建新函数的开销可能不会很高。