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

news/2024/7/15 17:26:59 标签: react.js, javascript, 前端

styled-components 高级特性

  • 样式继承
  • 嵌套
  • 设置主题

样式继承

新建 Demo.js 文件:

javascript">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 文件:

javascript">// 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,如下图:
在这里插入图片描述

嵌套

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

javascript">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

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

& 还有别的用处,示例:

javascript">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 样式表。
在这里插入图片描述

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

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

javascript">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 文件:

javascript">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 指定的样式。


http://www.niftyadmin.cn/n/233444.html

相关文章

【cmake篇】install 命令

install 命令用于指定文件的输出路径&#xff0c;这个文件可以是二进制执行文件、动态库文件、静态库文件&#xff0c;甚至是目录。通俗的来讲&#xff0c;install 其实就是把生成的文件统一拷贝到某个目录下&#xff0c;方便打包或者转移。 install 在不同场合&#xff0c;使…

Unity协程和线程的区别深入理解(附实验展示)

Unity协程和线程的区别附实验展示写在前面协程、进程、线程的概念进程与线程的区别协程与线程的区别实验1&#xff1a;协程中执行普通函数实验2&#xff1a;协程中开启另一个协程实验3&#xff1a;协程中开启WWW请求实验4&#xff1a;一个脚本中多个协程访问临界资源实验5&…

第三十一天 Linux介绍和基础命令

目录 1.前言 1.1 什么是Linux 1.2 为什么要学Linux 1.3 学完Linux能干什么 2.Linux简介 2.1 主流操作系统 2.2 Linux发展历史 3. Linux安装 3.1 安装方式介绍 3.2 安装VMware 3.3 安装Linux 3.4 网卡设置 3.5 安装SSH连接工具 3.6 Linux目录结构 4.Linux常用命令…

大白话讲解synchronized锁升级套路

synchronized锁是啥&#xff1f;锁其实就是一个对象&#xff0c;随便哪一个都可以&#xff0c;Java中所有的对象都是锁&#xff0c;换句话说&#xff0c;Java中所有对象都可以成为锁。 这次我们主要聊的是synchronized锁升级的套路 synchronized会经历四个阶段&#xff1a;无锁…

网络安全之密码学

目录 密码学 定义 密码的分类 对称加密 非对称加密 对称算法与非对称算法的优缺点 最佳解决办法 --- 用非对称加密算法加密对称加密算法的密钥 非对称加密如何解决对称加密的困境 密钥传输风险 密码管理难 常见算法 对称算法 非对称算法 完整性与身份认证最佳解决…

【Linux】用LCD文字祝愿(Framebuffer+Freetype)

目录 前言 一、LCD操作原理 &#xff08;1&#xff09;LCD和Framebuffer。 &#xff08;2&#xff09;LCD的操作&#xff1a; &#xff08;3&#xff09;核心函数&#xff08;后续也会经常用到&#xff09; ①open函数 ②ioctl函数 ③mmap函数 二、字符的点阵显示 &a…

Kafka的历史版本对应SpringBoot版本

截至目前&#xff08;2023年&#xff09;&#xff0c;Kafka的最新版本是2.9.0&#xff0c;发布于2022年11月30日。Kafka的历史版本可以在Kafka官方网站的下载页面中找到。Kafka从0.8版本开始发布&#xff0c;经历了多个版本的迭代和升级。以下是一些比较重要的Kafka版本及其发布…

2023年跨境电商狂潮,这几款神级辅助软件工具轻松助你赚翻天

作为跨境电商卖家&#xff0c;如何提高运营效率、降低操作难度&#xff0c;一直是摆在面前的难题。幸运的是&#xff0c;现如今市面上涌现出了众多的跨境电商辅助软件&#xff0c;它们可以帮助卖家们更从容地应对种种挑战。作为对跨境电商辅助软件经验丰富的东哥就为大家整理了…