我刚刚阅读了 styled-components
documentation以下是错误的,它会影响渲染时间。如果是这样,我该如何重构代码并使用所需的 Prop 来创建动态样式?
提前谢谢你。
标签组件
import React from 'react'
import styled from 'styled-components'
const Tab = ({ onClick, isSelected, children }) => {
const TabWrapper = styled.li`
display: flex;
align-items: center;
justify-content: center;
padding: 100px;
margin: 1px;
font-size: 3em;
color: ${props => (isSelected ? `white` : `black`)};
background-color: ${props => (isSelected ? `black` : `#C4C4C4`)};
cursor: ${props => (isSelected ? 'default' : `pointer`)};
`
return <TabWrapper onClick={onClick}>{children}</TabWrapper>
}
export default Tab
最佳答案
我相信文档所说的是您应该避免在渲染组件中包含您的样式:
这样做
const StyledWrapper = styled.div`
/* ... */
`
const Wrapper = ({ message }) => {
return <StyledWrapper>{message}</StyledWrapper>
}
取而代之
const Wrapper = ({ message }) => {
// WARNING: THIS IS VERY VERY BAD AND SLOW, DO NOT DO THIS!!!
const StyledWrapper = styled.div`
/* ... */
`
return <StyledWrapper>{message}</StyledWrapper>
}
因为发生的事情是当组件的 Props 发生变化时,组件将重新渲染并且样式将重新生成。因此,将其分开是有意义的。
因此,如果您进一步阅读根据 Prop 进行调整部分,他们会解释这一点:
const Button = styled.button`
/* Adapt the colours based on primary prop */
background: ${props => props.primary ? "palevioletred" : "white"};
color: ${props => props.primary ? "white" : "palevioletred"};
font-size: 1em;
margin: 1em;
padding: 0.25em 1em;
border: 2px solid palevioletred;
border-radius: 3px;
`;
// class X extends React.Component {
// ...
render(
<div>
<Button>Normal</Button>
<Button primary>Primary</Button>
</div>
);
// }
这是有效的,因为当你在类 X 中使用 Button 组件时,它会知道类 X 的属性,而无需你告诉它任何东西。
对于您的场景,我想解决方案很简单:
const TabWrapper = styled.li`
display: flex;
align-items: center;
justify-content: center;
padding: 100px;
margin: 1px;
font-size: 3em;
color: ${props => (props.isSelected ? `white` : `black`)};
background-color: ${props => (props.isSelected ? `black` : `#C4C4C4`)};
cursor: ${props => (props.isSelected ? 'default' : `pointer`)};
`;
const Tab = ({ onClick, isSelected, children }) => {
return <TabWrapper onClick={onClick}>{children}</TabWrapper>
}
const X = <Tab onClick={() => console.log('clicked')} isSelected>Some Children</Tab>
我根本没有测试过这个,所以请随意尝试一下,让我知道它是否适合你或任何适合你的东西!
关于javascript - React — 使用样式化组件传递 props,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52321539/