javascript - 在模板文字中定义函数

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

我正在使用 styled-components作为 React 样式的解决方案。他们有一个很好的方法,使用模板文字来插入 CSS。模板文字被传递给组件的 Prop ,这样你就可以做这样的事情:

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

关于javascript - 在模板文字中定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41968106/

相关文章:

reactjs - TypeError : Cannot read property 'getPosts' of undefined - useQuery hook, react 功能组件

javascript - 如何将 prop 传递到组件中?

javascript - 删除有条件的重复元素

javascript - 如何获取浏览器不解释的 css 样式表值?

javascript - 在滚动容器中使用 React-dates 的 DateRangePicker

javascript - 理解 JavaScript/jQuery 代码片段

Javascript - 任何类型的剩余运算符可以跳过未定义的属性?

javascript - 如何在 react 中获取对象中的嵌套数组?

javascript - jqgrid 组展开/折叠事件

javascript - 使用 jQuery 选项卡显示隐藏附加内容