【问题标题】:Reusable parametric css with styled components带有样式组件的可重用参数 css
【发布时间】:2019-08-19 16:37:06
【问题描述】:

我在我的 react 应用程序中使用 styled-components 库,我遇到了一个有趣的问题,我无法在网上找到一个优雅的解决方案。我想要实现的是拥有一段可重用的代码,可能类似于 sass mixins,这将允许我使用在悬停时使背景变暗的代码扩展我的所有按钮。

const DarkenHover = css<{ active?: boolean; normalColor: string; activeColor: string }>`
    background-color: ${p => (p.active ? p.normalColor : p.activeColor)};
    &:hover {
        background-color: ${p => darken(0.1)(p.active ? p.normalColor : p.activeColor)};
    }
    transition: background-color .1s ease-in;
`;

const FooButton = styled.div<{ active?: boolean }>`
    ${p => DarkenHover({
        active: p.active,
        normalColor: "red",
        activeColor: "blue",
    })}
`;

const FooButton = styled.div<{ active?: boolean }>`
    ${p => DarkenHover({
        active: p.active,
        normalColor: "white",
        activeColor: "green",
    })}
`;

这显然不是有效的语法,但它演示了我的用例。我怎样才能使用这个带有属性的DarkenHover css 对象?

【问题讨论】:

    标签: javascript typescript mixins styled-components


    【解决方案1】:

    您可以将样式保存在 var 中并在以后重复使用。

    const animation = css`
     background-color: ${p => p.active ? ThemeColors.backgroundDark : "white"};
        &:hover {
            background-color: ${p =>  darken(0.1)(p.active ? p.normalColor : p.activeColor)};
        }
        transition: background-color .1s ease-in;
     }
    `;
    

    当你在另一个组件中使用它时,它应该能够访问它的props:

    const FooButton = styled.div`
        ${animation};
    `
    

    还能够为每个样式组件拥有单独的道具,可以通过attrs 方法传递:

    const FooButton = styled.div.attrs({normalColor: '#000000' })`
       ${animation}
    `;
    

    【讨论】:

    • 这对我没有帮助。如何为这个 css 对象的不同用途传递不同的属性(示例中的 normalColoractiveColor 道具)。
    • 您可以在渲染时将它们作为 props.when 传递给组件。 &lt;FooButton normalColor='#000000' /&gt;.
    • 这也不是解决方案。我想为样式化组件定义它们,而不是为它的所有用法。
    • 如果你想要每个样式的组件,你可以通过 attrs: const FooButton = styled.div.attrs({normalColor: '#000000' }) ${animation}; `
    • 是的,这似乎可行,但它们必须具有匹配的名称。这是最好的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 2019-06-29
    • 2018-10-16
    • 2021-10-11
    • 2020-01-17
    • 1970-01-01
    相关资源
    最近更新 更多