React - прохождение реквизита со стилевыми компонентами - PullRequest
0 голосов
/ 13 сентября 2018

Я только что прочитал в styled-components документации , что следующее неверно и это повлияет на время рендеринга. Если это так, как я могу изменить код и использовать необходимые реквизиты для создания динамического стиля?

Заранее спасибо.

Компонент табуляции

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

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я считаю, что документация говорит о том, что вам следует избегать включения ваших стилей в компонент рендеринга:

СДЕЛАЙ ЭТО

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>

Я вообще не проверял это, поэтому, пожалуйста, не стесняйтесь попробовать его и дайте мне знать, работает ли он для вас или что-то еще работало для вас!

0 голосов
/ 13 сентября 2018

Рассмотрим стилизованные компоненты. В документации приведен пример использования contexts api [2] для разных тем.

[1] https://www.styled -components.com / docs / advanced

[2] https://reactjs.org/docs/context.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...