总结react中css的使用

news2025/1/14 20:24:51

1、css in js

css in js有很多库,这里介绍styled-components

styled-components

下载【vscode可以安装vscode-styled-components 插件,有代码提示】

npm i styled-components

1、然后为某个组件新建style.js文件,然后写一些样式。

import styled from 'styled-components'

export const Container = styled.div`
  color: green;
  .content {
    color: red;
  }
`

         styled.div是一个函数,上面是用模板字符串的方式调用一个函数(示例代码如下),这个函数返回样式组件(这个样式组件最终渲染为带唯一类名的原生标签,上面用选择器写的样式都会唯一类名加上该选择器的后代选择器,效果见下面的图1)。

function myTag(strings, ...values) {
  console.log(strings); // ["Hello, ", "!"]
  console.log(values); // ["world"]
}

myTag`Hello, ${"world"}!`;

2、使用上面的样式组件

import { Container } from './style'

const Recommend = memo(() => {
  return (
    <Container>
      哈哈
      <RecomChild></RecomChild>
    </Container>
  )
})

        最终的效果如下图:【那些能继承的css规则,子组件也会继承,比如color、font-family等,可以每个组件用一个样式组件来避免。】

图1-最终渲染dom结构与样式

其他用法

1、使用js的数据

样式文件接收并使用传过来的props。

传入过程:往样式组件上存入props

import React, { useState } from 'react'
import { AppWrapper } from './style'
function App() {
  const [styleO] = useState({ size: 30, color: 'pink' })
  return (
    <div>
      <AppWrapper {...styleO}>
      </AppWrapper>
    </div>
  )
}

export default App

使用过程:在样式组件的定义文件中,使用函数接收props并使用

import styled from 'styled-components'
// AppWrapper会渲染为div标签,AppWrapper下的子元素使用类container有效。
export const AppWrapper = styled.div`
  .container {
    &:hover {
      color: ${(p) => p.color || 'red'};
      font-size: ${(p) => p.size + 'px'};
    }
  }

 【为什么要要传入函数:在本文件作用域并没有props,所以设计成函数,由styled-components调用这个函数,并传入props 】

2、利用attrs设置标签属性

        同样是传入回调,回调接收props,然后返回标签属性的描述对象,最后别忘了模板字符串的调用。

export const InputWrapper = styled.input.attrs((props) => ({
  type: props.$inputType || 'radio'
}))``

        如果是原生的标签属性,能直接在使用的时候传递,不需要在定义处写明。自定义的属性需要以$作为前缀,这些自定义属性会被筛选掉,并不会添加到真实的dom上。

<Input defaultValue="@geelen" type="text" $inputColor="rebeccapurple" />

        如上,defaultValue和type这些自定义属性会直接添加到dom上,而$inputColor需要手动使用。

3、继承

styled中传入已经写好的样式组件,就能继承他的样式,可以做抽离。

const button = styled.button`
              padding: 8px 30px;
  `
const ButtonP = styled(button)`
  color: 'red';
`

4、主题切换

1、从styled-components中引入ThemeProvider组件,需要传入theme这个标签属性,属性值就是个对象,对象包含样式信息。

import React, { useState } from 'react'
import { ThemeProvider } from 'styled-components'
import { Button } from './style'
const theme1 = {
  colors: {
    primary: 'blue',
    secondary: 'green'
  }
}

const theme2 = {
  colors: {
    primary: 'red',
    secondary: 'yellow'
  }
}
function App() {
    //传入theme1,默认展示这个,后续改currentTheme的值
  const [currentTheme, setCurrentTheme] = useState(theme1)

  const handleThemeChange = () => {
    setCurrentTheme(currentTheme === theme1 ? theme2 : theme1)
  }

  return (
    <ThemeProvider theme={currentTheme}>
      {/* 这里的theme会挂载到每个样式组件(子组件)的props下,比如下卖弄的Button */}
      <Button onClick={handleThemeChange}>切换主题</Button>
    </ThemeProvider>
  )
}

export default App

        ThemeProvider这个样式组件内部的样式组件上的props上就会有传入的theme。比如Button这个样式组件就能拿到,代码如下:

import styled from 'styled-components';

export const Button = styled.button`
  background-color: ${props => props.theme.colors.primary};
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 4px;
`;

5、定义css片段

        从styled-components中引入css这个函数,然后把一些样式传给它,返回css片段,就能直接在样式组件中使用这个变量了。【本质应该就是字符串,但是这样写有更好的提示】

import React from "react";
import styled, {css} from "styled-components";

const commonStyle = css`
  color: white;
  font-size: 20px;
`;

const Button = styled.button`
  ${commonStyle};
  background-color: red;
`;

const AnotherButton = styled.button`
  ${commonStyle};
  background-color: green;
`;

2、css module

使用步骤

1、新建一个[name].module.css文件,里面正常写css样式

.content{
  color: red;
}

2、引入上面的文件,然后在className处使用定义好的css类。【这样只会在这个组件中生效,对子组件无效】

import homeCss from './home.module.css'


<p className={homeCss.content}>Home</p>

原理

【将我们写的css类转为独一无二的类,比如将 .content 转为 .home_content__1bZH5 

         即:.模块_类名_哈希】

        这需要打包工具的配合。以webpack为例,需要把css-loader的modules设为true。【当然,create-react-app已经设置好了,我们不用管。】

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          'style-loader',
          {
            loader: 'css-loader',
            options: {
              modules: true,
            },
          },
        ],
      },
    ],
  },
};

        在构建过程中,会将 CSS 类名转换为唯一的类。

        例如,.content可能会被转换 为.home_content__1bZH5

        在运行时,JavaScript 会使用这些唯一的标识符来设置元素的类名。

<div class="home_content__1bZH5">Hello, world!</div>

3、基本的css

主要就是内联样式和css文件的形式

内联样式

        通过标签属性style进行设置,需要传递对象。

普通css文件

        建一个css文件后通过import引入,然后className使用文件中定义的类。【因为没有作用域,这样使用是全局生效。】

与vue的区别

        css in js和css module都有生成唯一的类名来避免冲突,而vue中的scoped则是通过生成唯一的属性(data-v-哈希的形式),然后经过属性选择器来解决冲突。

        

        因为vue是通过属性选择器来定义样式,所以我们在该第三方库的组件(就是子组件)时是无法直接修改他的样式的,需要借助::v-deep这类深度修改器。原理就是增大选择器的权重。

        父组件修改子组件样式的代码如下,最终的效果见下图,其中[data-v-7ba5bd90]这个属性选择器代表父组件,后面的.child-content就是子组件中的一个类,这样写的权重会比子组件的大,就会用父组件的这个效果。

::v-deep .child-content {
  color: red;
}

end 

        总结下react中的css使用,着重介绍了styled-components,还探究了下其与vue中css的区别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1281450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringAMQP入门案例——发送消息

依赖 <!--SpringAMQP起步依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> yml配置文件 自行修改 spring:rabbitmq:host: 192.168.220.130 # …

【力扣】——可获得的最大点数(滑动窗口)

几张卡牌 排成一行&#xff0c;每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动&#xff0c;你可以从行的开头或者末尾拿一张卡牌&#xff0c;最终你必须正好拿 k 张卡牌。 你的点数就是你拿到手中的所有卡牌的点数之和。 给你一个整数数组 cardPoi…

「C++」C++11新特性

&#x1f4bb;文章目录 &#x1f4c4;前言右值引用概念右值引用的意义 lambada表达式包装器function包装器bind包装器 &#x1f4d3;总结 &#x1f4c4;前言 C标准10年磨一剑&#xff0c;于2011年迎来了它真正意义上的第二个标准&#xff0c;C11能更好地适用与系统开发和库开发…

高校人员信息管理系统C++

代码&#xff1a;https://mbd.pub/o/bread/ZZeZk5lx 一、基本内容论述 1、问题描述 某高校有四类员工&#xff1a;教师、实验员、行政人员、教师兼行政人员&#xff1b;共有的信息包括&#xff1a;编号、姓名、性别、年龄等。其中&#xff0c;教师还包含的信息有&#xff1a;所…

实现一个简单的网络通信下(udp)

时间过去好久了&#xff0c;先回忆一下上一篇博客的代码&#xff01;&#xff01; 目前来看&#xff0c;我们客户端发一条消息&#xff0c;我服务器收到这一条消息之后呢&#xff0c;服务器也知道了是谁给我发来的消息&#xff0c;紧接这就把这条消息放进buffer当中&#xff0c…

陀螺仪LSM6DSV16X与AI集成(1)----轮询获取陀螺仪数据

陀螺仪LSM6DSV16X与AI集成.1--轮询获取陀螺仪数据 概述视频教学样品申请通信模式管脚定义IIC通信模式速率生成STM32CUBEMX串口配置IIC配置CS和SA0设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置设置量程和速率配置过滤链轮询读取数据主程序演示 概述 本文将介绍如何使…

【算法】单调栈题单——矩阵系列⭐

文章目录 题目列表84. 柱状图中最大的矩形&#xff08;单调栈找左右两边第一个更低的位置&#xff09;85. 最大矩形⭐⭐⭐⭐⭐解法1——使用柱状图的优化暴力方法解法2——单调栈 &#xff1a;归因到 84. 柱状图中最大的矩形 &#x1f402; 1504. 统计全 1 子矩形⭐解法1——枚…

关于媒体查询不能生效的原因

问题 今天写媒体查询&#xff0c;遇到了个问题&#xff0c;卡了很久&#xff0c;引入三个样式&#xff1a;mainPageCommon.css、mainPageBig.css、mainPageSmall.css。其中的两个样式可以生效&#xff0c;但是小尺寸的媒体查询不能生效&#xff0c;这里很奇怪&#xff01;&…

STM32F407-14.3.10-01PWM模式

PWM 模式 脉冲宽度调制模式可以生成一个信号&#xff0c;该信号频率由 TIMx_ARR⑩ 寄存器值决定&#xff0c;其占空比由 TIMx_CCRx⑤ 寄存器值决定。 通过向 TIMx_CCMRx 寄存器中的 OCxM⑰ 位写入 110 &#xff08;PWM 模式 1&#xff09;或 111 &#xff08;PWM 模式 2&#…

C++学习之路(十七)C++ 用Qt5实现一个工具箱(增加托盘图标并且增加显示和退出菜单)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《为屏幕颜色提取功能增加一个点击复制的功能》功能。今天我们增加一个比较正式点的功能&#xff0c;就是增加托盘图标并且增加显示和退出菜单&#xff08;越来越像回事了吧 &#x1f601; &#xff09;。下面我们就来…

ssm医院门诊互联电子病历管理信息系统源码和论文

摘 要 网络的广泛应用给生活带来了十分的便利。所以把医院门诊互联电子病历管理与现在网络相结合&#xff0c;利用java技术建设医院门诊互联电子病历管理信息系统&#xff0c;实现医院门诊互联电子病历的信息化。则对于进一步提高医院门诊互联电子病历管理发展&#xff0c;对…

【电机控制】PMSM无感foc控制(五)相电流检测及重构 — 单电阻采样

0. 前言 相电流采样再FOC控制中是一个关键的环节&#xff0c;鉴于成本和易用性&#xff0c;目前应用较多的相电流采样方式是分流电阻采样&#xff0c;包括单电阻、双电阻以及三电阻采样法。 本章节先讲解单电阻采样相电流的检测及重构技术&#xff0c;在下一章讲解双电阻和三电…

项目实战一-性能测试筑基

这里写目录标题 一、为什么程序会出现性能问题、性能问题是怎么出现的&#xff1f;二、功能测试和性能测试的区别是什么&#xff1f;三、核心性能指标1、用户角度核心a、响应时间&#xff1a;b、并发量 2、成本角度3、运维角度面试题、并发量和吞吐量得区别&#xff1f;a、吞吐…

Qt 如何操作SQLite3数据库?数据库创建和表格的增删改查?

# 前言 项目源码下载 https://gitcode.com/m0_45463480/QSQLite3/tree/main # 第一步 项目配置 平台:windows10 Qt版本:Qt 5.14.2 在.pro添加 QT += sql 需要的头文件 #include <QSqlDatabase>#include <QSqlError>#include <QSqlQuery>#include &…

【强化学习算法】Q-learning原理及实现

实现代码github仓库&#xff1a;RL-BaselineCode 代码库将持续更新&#xff0c;希望得到您的支持⭐&#xff0c;让我们一起进步&#xff01; 文章目录 1. 原理讲解1.1 Q值更新公式1.2 ε-greedy随机方法 2. 算法实现2.1 算法简要流程2.2 游戏场景2.3 算法实现 3. 参考文章 1. 原…

[架构之路-256]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 架构设计 - 软件系统不同层次的复用与软件系统向越来越复杂的方向聚合

目录 前言&#xff1a; 一、CPU寄存器级的复用&#xff1a;CPU寄存器 二、指令级复用&#xff1a;二进制指令 三、过程级复用&#xff1a;汇编语言 四、函数级复用&#xff1a;C语言 五、对象级复用&#xff1a;C, Java, Python 六、组件级复用 七、服务级复用 八、微…

win10下使用内置Linux

Win10安装Ubuntu子系统 #推荐博客 https://www.cnblogs.com/xiaoliangge/p/9124089.html #推荐视频 https://www.bilibili.com/video/BV184411i7As?spm_id_from333.337.search-card.all.click #Ubuntu18.04安装教程 https://edu.csdn.net/skill/gml/gml-214229ddcc6a496ba175…

基于hadoop下的Kafka分布式安装

简介 Kafka是一种分布式流处理平台&#xff0c;它具有高吞吐量、可扩展性、可靠性、实时性和灵活性等优点。它能够支持每秒数百万条消息的传输&#xff0c;并且可以通过增加节点来增加吞吐量和存储容量。Kafka通过将数据复制到多个节点来实现数据冗余和高可用性&#xff0c;即使…

JAVA代码优化:Easy Excel(操作Excel文件的开源工具)

Easy Excel官网&#xff1a; EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel (alibaba.com) https://easyexcel.opensource.alibaba.com/ Easy Excel的特点和优势&#xff1a; 简单易用&#xff1a;Easy Excel提供了简洁的API&#xff0c;使用起来非常方便。开发…

xxl-job(分布式调度任务)

简介 针对分布式任务调度的需求&#xff0c;市场上出现了很多的产品&#xff1a; 1)TBSchedule&#xff1a;淘宝推出的一款非常优秀的高性能分布式调度框架&#xff0c;目前被应用于阿里&#xff0c;京东&#xff0c;支付宝&#xff0c;国美等很多互联网企业的流程调度系统中。…