Как применить левое поле к стилизованному компоненту на основе условия с помощью react?

#reactjs

#reactjs

Вопрос:

у меня есть повторно используемый компонент addButton, который использует компонент IconButton. addButton, когда имеет значение active prop true и значение marginLeft prop, тогда следует применять левое поле 14 пикселей, если не 8 пикселей.

addButton используется в компонентах Child1 и Child2. Компонент Child1 передает prop левого края компоненту addButton.

ниже приведен мой код,

 function Child1() {
    return (
        <AddButton marginLeft={14}/> //here marginLeft prop passed
    );
}

 function Child2() {
    return (
        <AddButton /> 
    );
}

interface AddButtonProps {
    marginLeft?: number;
}

export const AddButton = ({marginLeft}: AddButtonProps) => {
    const [saving, setSaving] = React.useState(false);
    const {isDrawing} = useDrawing(item);

    return (
        <PrimaryButton active={isDrawing} marginLeft={marginLeft}/>
    );
};

interface PrimaryButtonProps {
    active?: boolean;
    marginLeft?: number;
}

const PrimaryButton = (props: PrimaryButtonProps) => {
    return <PrimaryIconButtonElement {...props} size={16} variant="primary" />;
};

const PrimaryIconButtonElement = styled(IconButton)<{
    $marginLeft?: number;
    $active?: boolean;
}>`
    width: 32px;
    height: 32px;
    margin-left: ${props =>
        props.$active amp;amp; props.$marginLeft ? props.$marginLeft   'px' : '8px'}; //this doesn't work
`;


function IconButton({active,size,...rest}: Props) {
    return (
        <Wrapper $active={active}>
            <Icon size={size}/>
        </Wrapper>
    );
}
  

теперь, когда активный параметр имеет значение true и левое поле передается для компонента addButton, я хочу, чтобы у PrimaryButtonElement было левое поле 14 пикселей.

но по какой-то причине этот стиль не применяется в приведенном выше коде.

Кто-нибудь может помочь мне исправить это. Спасибо.

Комментарии:

1. Используете ли вы пакет styledcomponents?

2. да, используя его…

3. Возможно, из-за того, что вы используете свойство «active» в «IconButton», оно не передается в styledcomponent. удалите свойство в «IconButton» или журнале, чтобы увидеть, действительно ли свойство получено в styledcomponent

Ответ №1:

Согласно документации по стилизованному компоненту:

Метод styled отлично работает со всеми вашими собственными или любыми сторонними компонентами, если они присоединяют переданный параметр className к элементу DOM.

https://styled-components.com/docs/basics#styling-any-component

Итак, в вашем случае вам нужно:

Добавьте в свой интерфейс Props поле className:

 interface Props {
  active?: boolean;
  size?: number;
  className?: string;
}
  

И на вашей кнопке IconButton укажите className:

 function IconButton({active, size, className, ...rest}: Props) {
    return (
        <Wrapper className={className} active={active}>
            <Icon size={size}/>
        </Wrapper>
    );
}
  

Вам также необходимо удалить префикс $ вашего реквизита в PrimaryIconButtonElement:

 const PrimaryIconButtonElement = styled(IconButton)<{
  marginLeft?: number;
  active?: boolean;
}>`
  width: 32px;
  height: 32px;
  margin-left: ${(props) =>
    props.active amp;amp; props.marginLeft
      ? props.marginLeft   "px"
      : "8px"};
`;
  

Я провел тест, заменив вашу оболочку и теги значков для div, и все сработало хорошо.

* Если ваша оболочка является компонентом react, вам также нужно будет отправить className ему.