您现在的位置是:首页 >技术杂谈 >React styled-components(三)—— 高级特性网站首页技术杂谈

React styled-components(三)—— 高级特性

*且听风吟 2023-05-15 08:00:01
简介React styled-components(三)—— 高级特性

styled-components 高级特性

样式继承

新建 Demo.js 文件:

import React, { Component } from 'react'
import styled from 'styled-components';

const CustomStyle = styled.div`
    p {     
      color: red;
    }
`

const ContextBox = styled(CustomStyle)`
    width: 800px;
    height: 200px;
    margin: 0 auto;
`

class Home extends Component {
  render () {
    return (
      <div>
        <ContextBox>
          <p>Hello World, this is my first styled component!</p>
          <p>11111111111</p>
          <p>22222222222</p>
          <p>33333333333</p>
        </ContextBox>
      </div>
    )
  }
}
export default Home

App.js 中引入 Demo.js 文件:

// import logo from './assets/images/logo.svg';
import './assets/css/App.css';
import Demo from './components/Demo'

function App () {
  return (
    <div className="App">
      <header className="App-header">
        {/* <img src={logo} className="App-logo" alt="logo" /> */}
        <p>
          文字 <code>src/App.js</code> Hello World!.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          https://reactjs.org
        </a>
      </header>
      <Demo />
    </div>
  );
}

export default App;

页面效果:
在这里插入图片描述

编译后它们会使用不同的 className,如下图:
在这里插入图片描述

嵌套

& 符号表示引用主组件,示例:

import React, { Component } from 'react'
import styled from 'styled-components';

const ContextBox = styled.div`
    width: 800px;
    height: 200px;
    margin: 0 auto;
`

const ContextP = styled.h3`
    font-size: 20px;
    /* 应用于className为blue的ContextP组件 */
    &.blue{
      color: blue;
    }

    /* 应用于className为red的ContextP组件里的所有子组件或者html标签 */
    .red {
      color: red;
    }
`

class Home extends Component {
  render () {
    return (
      <ContextBox>
        <ContextP className="blue">11111111111</ContextP>
        <ContextP><p className="red">22222222222</p></ContextP>
        <ContextP><p>33333333333</p></ContextP>
      </ContextBox>
    )
  }
}
export default Home

页面效果:
在这里插入图片描述

& 还有别的用处,示例:

import React, { Component } from 'react'
import styled from 'styled-components';

const ContextBox = styled.div`
    width: 800px;
    height: 200px;
    margin: 0 auto;
`

const ContextP = styled.h3`
    font-size: 20px;
    & {
      color: blue;
    }
    &&{
      color: purple;
    }

    /* 应用于className为red的ContextP组件里的所有子组件或者html标签 */
    .red {
      color: red;
    }
`

class Home extends Component {
  render () {
    return (
      <ContextBox>
        <ContextP>11111111111</ContextP>
        <ContextP><p className="red">22222222222</p></ContextP>
        <ContextP><p>33333333333</p></ContextP>
      </ContextBox>
    )
  }
}
export default Home

最终效果如下所示,一个 & 就代表一个 class 权重也就是说最后颜色会渲染 purple ,原因是 ContextP 被作用于了 .sc-csCMJt .bBDcsi 样式表。
在这里插入图片描述

这个功能非常有用,比如在使用第三方组件想要覆盖它的样式的时候,可以加多个 & 来提高样式权重,从而覆盖第三方组件的样式。

& 还可以被用作上下文选择符:

import React, { Component } from 'react'
import styled from 'styled-components';

const ContextBox = styled.div`
    width: 800px;
    height: 200px;
    margin: 0 auto;
`

const ContextP = styled.h3`
    font-size: 20px;

    /* 应用于紧邻ContextP组件的下一个ContextP组件 */
    & + &{
      color: blue;
    }

    /* 应用于className为red的ContextP组件里的所有子组件或者html标签 */
    .red {
      color: red;
    }
`

class Home extends Component {
  render () {
    return (
      <ContextBox>
        <ContextP>11111111111</ContextP>
        <ContextP>33333333333</ContextP>
        <ContextP><p className="red">22222222222</p></ContextP>
      </ContextBox>
    )
  }
}
export default Home

页面效果:
在这里插入图片描述

设置主题

styled 支持设置主题,来达到共享样式的目的。

修改 Demo.js 文件:

import React, { Component } from 'react'
import styled, { ThemeProvider } from 'styled-components';

const ContextBox = styled.div`
    width: 800px;
    height: 200px;
    margin: 0 auto;
`

const ContextP = styled.h3`
    color: ${props => props.theme.themeColor};
    font-size: ${props => props.theme.fontSize};
`

class Home extends Component {
  render () {
    return (
      <ThemeProvider theme={{ themeColor: 'red', fontSize: '20px' }}>
        <ContextBox>
          <ContextP>11111111111</ContextP>
          <ContextP>22222222222</ContextP>
          <ContextP>33333333333</ContextP>
        </ContextBox>
      </ThemeProvider>
    )
  }
}
export default Home

页面效果:
在这里插入图片描述

可以看到,h3 标签的颜色和字体大小都设置成了 theme 指定的样式。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。