样式组件 (styled-components) |将一个叠加在另一个之上

Styling Components (styled-components) | Superimposing one on top of the other

问题是这样的:
有一个使用 styled-components 创建的 UiInput React 组件,在它上面还有一个 UiInputExt React 组件,它应该覆盖 UiInput 中定义的一些样式,但由于某些原因并没有发生,显然它甚至没有添加相应的class...
我附上下面的代码:

const StyledInput = styled.input`
    color: ${(props) => props.styles.color};

    ::placeholder,
    ::-webkit-input-placeholder {
        color: ${(props) => props.styles.color};
    }

    :-moz-placeholder {
        color: ${(props) => props.styles.color};
        opacity: 1;
    }

    ::-moz-placeholder {
        color: ${(props) => props.styles.color};
        opacity: 1;
    }

    :-ms-input-placeholder {
        color: ${(props) => props.styles.color};
    }
`;

<StyledInput 
    id={id}
    className={cn(styles.input, classes)}
    type={type}
    placeholder={placeholder}
    styles={isTheme.styles}
>
</StyledInput>

以及相应的覆盖(不起作用!)

import UiInput from '../';

const StyledUiInputExt = styled(UiInput)`
    color: ${(props) => props.styles.color_uiinputext};

    ::placeholder,
    ::-webkit-input-placeholder {
        color: ${(props) => props.styles.color_uiinputext};
    }

    :-moz-placeholder {
        color: ${(props) => props.styles.color_uiinputext};
        opacity: 1;
    }

    ::-moz-placeholder {
        color: ${(props) => props.styles.color_uiinputext};
        opacity: 1;
    }

    :-ms-input-placeholder {
        color: ${(props) => props.styles.color_uiinputext};
    }
`;

<StyledUiInputExt classes={cn(styles.input, classes)} {...props} styles={isTheme.styles}></StyledUiInputExt>

您没有导出带样式的组件 StyledInput,而是导出正在渲染的普通 React 组件 StyledInput

const StyledInput = styled.input`
  color: blue;
`;

const UiInput = () => {
  return <StyledInput />;
};

export default UiInput;

UiInputExt

import UiInput from "./UiInput";

const StyledInputExt = styled(UiInput)`
  color: green;
`;

const UiInputExt = () => {
  return <StyledInputExt />;
};

您应用于 UiInput 的样式未应用于它呈现的 JSX,即它未传递给 StyledInput

您只能覆盖其他样式组件。为此你应该直接 export/import StyledInput (重命名为 UiInput)。

const UiInput = styled.input`
  color: blue;
`;

export default UiInput;

另一种方法是将 UiInput 导出为带样式的组件,并确保 className 属性传递给 StyledInput 组件。

const StyledInput = styled.input`
  color: blue;
`;

const UiInput = ({ className }) => {
  return <StyledInput className={className} />;
};

export default styled(UiInput)``;