如何在样式组件中动态呈现伪内容之前

Posted

技术标签:

【中文标题】如何在样式组件中动态呈现伪内容之前【英文标题】:How to render pseudo before content dynamically in styled-component 【发布时间】:2018-03-02 12:24:41 【问题描述】:

我在样式组件中动态呈现伪内容之前遇到了麻烦。

我做错了吗?

我在静态渲染内容之前没有问题,但是当我动态尝试时它不起作用。

反应组件

const Test = (props) => 

    return (
        <Text before=12345>
            props.children
        </Text>
    );

;

样式化组件(不工作)

const Text = styled.span`

    &:before 
        content: $props => 
            console.log(props.before); // I see '12345' in log.
            return props.before;
            
    


`;

样式化组件(这很好用)

const Text = styled.span`

    &:before 
        content: '12345'
    


`;

【问题讨论】:

不建议将动态内容属性与样式化组件一起使用,因为它会为每个内容创建新类,如果只有几个不同的“内容”你很好,但如果它可以是任何东西你可能表现不佳。 【参考方案1】:

这是因为 content 值必须在 css 中的引号内

例子:

const Block = styled.div`
    &:before 
        display: absolute;
        top:0;
        content: '$props => props.before'
    
`

请注意,我使用的是ES6 new features,其中单个语句函数不需要使用花括号return

Codepen:https://codepen.io/metju/pen/zEKeOm

【讨论】:

即使您已经返回了一个字符串,为什么还要将表达式包装在另一个引号中?例如content: $props =&gt; props.test ? "foo" : " bar"; 失败 content: '$props =&gt; props.test ? "foo" : " bar"'; 工作【参考方案2】:

我所做的是为此使用 css 辅助函数:

const Text = styled.span`
  &:before 
     $props => !!props.before ?
      css`content: props.before;` : css`content: ' ?'';`
     ;
  
`

【讨论】:

【参考方案3】:

styled-components 和 sass 一样,没什么不同

const Text = styled.span`
    &:before 
       content: $props => !!props.before ? props.before : " ?";
    

`;

I am a // 呈现:“I am a ?”

参考取自 Before and After pseudo classes used with styled-components

【讨论】:

我用过!!props.before,这是一个将字符串转换为布尔值的真实语句。只是为了检查您是否收到props.before 感谢您的帮助!但是,它不起作用......我也试过这个。 &:before 内容: $props => !!props.before ? 'aaa' : "bbb"; 'aaa' 和 'bbb' 都不会被渲染。 当然,正如我在帖子中提到的,如果我这样写,它会起作用。 &:before 内容:'12345'

以上是关于如何在样式组件中动态呈现伪内容之前的主要内容,如果未能解决你的问题,请参考以下文章

如何在悬停内容之前更改样式组件[emotion.js,样式组件]

如何使用样式组件在伪元素后旋转图像

如何在带有样式组件的伪元素上传递道具?

如何将graphQl查询中的变量转换为内联样式或样式组件中的伪元素

伪类常见用法及动态更改内容样式的方法

如何在 Chrome 的检查器中添加/插入之前或之后的伪元素?