Я считаю, что документация говорит о том, что вам следует избегать включения ваших стилей в компонент рендеринга:
СДЕЛАЙ ЭТО
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>
}
Поскольку то, что происходит, когда изменяется реквизит компонента, то компонент будет повторно визуализироваться, и стиль будет обновляться. Поэтому имеет смысл держать это отдельно.
Итак, если вы продолжите читать раздел Адаптация на основе реквизита , они объяснят это:
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>
);
// }
это работает, потому что, когда вы используете компонент Button в классе X, он будет знать реквизиты класса 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>
Я вообще не проверял это, поэтому, пожалуйста, не стесняйтесь попробовать его и дайте мне знать, работает ли он для вас или что-то еще работало для вас!