4

我使用styled-components作为 React 样式的解决方案。他们有一个很好的方法,使用模板文字来插入 CSS。模板文字被传递给组件的 props,以便您可以执行以下操作:

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

结果是一个组件div根据 的值呈现具有绿色或红色背景的标签isMatching。以上将通过 JSX 像这样使用:

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

每次值props改变时,这个字符串都会被重新插值。这最终让我想到了我的问题:

每次插入模板文字时,是否会重新定义模板文字中定义的箭头函数?

如果是这样,那么我可能会考虑在模板文字之外创建函数并将其传入,例如

const PasswordsMatchMessage = styled.div`
    background: ${isMatchingFn};
`
4

1 回答 1

6

是的,每次插入模板文字时,它都会定义一个新版本的函数。您可以通过定义自己的跟踪先前值的标记来验证这一点。

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

于 2017-01-31T22:10:51.163 回答