React18入门(第四篇)——React中的4种CSS使用方式,CSS Module、CSS-in-Js详解

news2024/10/6 1:42:38

文章目录

    • 一、普通方式使用CSS
        • 1.1 元素内联 style
        • 1.2 引入 CSS 文件
        • 1.3 类名插件 -- Classnames
        • 1.4 注意事项
    • 二、CSS Module
        • 2.1 普通 CSS 的问题
        • 2.2 CSS Module 的特点
        • 2.3 简单使用
    • 三、使用 sass
        • 3.1 sass 简介
        • 3.2 使用
    • 四、CSS-in-JS
        • 4.1 CSS-in-JS 简介
        • 4.2 CSS-in-JS 常用工具之 Styled-component
        • 4.3 CSS-in-Js 常用工具之 Styled-js 和 Emot
    • 五、总结

一、普通方式使用CSS

1.1 元素内联 style
  • 和 HTML 元素的 style 类似
  • 但必须是 JS 对象的写法,不能是字符串
  • 样式名要驼峰式写法,例如:fontSize
import React, { FC } from 'react'
import './QuestionCard.css'

type PropsType = {
  id: string
  isPublished: boolean
}
const QuestionCard: FC<PropsType> = props => {
  const { id, isPublished } = props
  return (
    <div key={id} className="list-item">
      {isPublished ? (
        <span style={{ color: 'green', fontSize: '20px' }}>已发布</span>
      ) : (
        <span>未发布</span>
      )}
    </div>
  )
}
export default QuestionCard
1.2 引入 CSS 文件
  • 使用 CSS 文件
  • JSX 使用 className
  • 可使用 clsx 或 classnames 做条件判断

定义
在这里插入图片描述
引入并使用
在这里插入图片描述

1.3 类名插件 – Classnames

classname地址:https://www.npmjs.com/package/classnames

安装

# via npm
npm install classnames

# via Bower
bower install classnames

# or Yarn (note that it will automatically save the package to your `dependencies` in `package.json`)
yarn add classnames

使用

var classNames = require('classnames');
classNames('foo', 'bar'); // => 'foo bar'
1.4 注意事项

注:尽量不要用内联 style

  • 内联style 代码多,性能差、扩展性不好
  • 外链 CSS 文件可复用代码,可单纯缓存文件
  • PS: 这和 React 无关,学HMTL CSS 时就应该知道

二、CSS Module

2.1 普通 CSS 的问题
  • React 使用组件化开发,不适合
  • 多个组件,就需要多个 CSS 文件
  • 多个 CSS 文件就很容易造成 className 重复,产生覆盖。不好管理
  • CSS Modlule 就是解决方案之一
2.2 CSS Module 的特点
  • 每个 CSS 文件都当做单独的模块,命名格式: xxx.module.css
  • 为每个 className 增加后缀名,不让它们重复
  • Creat-React-App 原生支持 CSS Module
2.3 简单使用

2.3.1 定义样式

在这里插入图片描述
2.3.2 使用

在这里插入图片描述


三、使用 sass

3.1 sass 简介
  • CSS 语法比较原始,比如说,不能嵌套
  • 现代开发一般使用 less sass 等预处理语言
  • create-react-app 原生支持 Sass Module , 后缀改成 .scss 即可
3.2 使用

定义时,文件名用 .scss 后缀

**在这里插入图片描述**
使用示例:

在这里插入图片描述


四、CSS-in-JS

4.1 CSS-in-JS 简介
  • 是一种解决方案(而非工具名称),有好几个工具
  • 在 JS 中 写 CSS,带来极大的灵活性
  • 它和内联 style 完全不一样,也不会有内联 style 的问题
4.2 CSS-in-JS 常用工具之 Styled-component

官网:https://styled-components.com/

安装

npm install styled-components --save

使用

import React, { FC } from 'react'
import styled, { css } from 'styled-components'

type ButtonPropsType = {
  primary?: boolean
}
const Button = styled.button`
  background: transparent;
  border-radius: 3px;
  border: 2px solid #bf4f74;
  color: #bf4f74;
  margin: 0 1em;
  padding: 0.25em 1em;

  ${(props: ButtonPropsType) =>
    props.primary &&
    css`
      background: #bf4f74;
      color: white;
    `}
`
const Container = styled.div`
  text-align: center;
`

const Demo: FC = () => {
  return (
    <>
      <div>
        <p>styleComponentsDemo</p>
        <Container>
          <Button>Normal Button</Button>
          <Button primary>Primary Button</Button>
        </Container>
      </div>
    </>
  )
}
export default Demo

实现效果:
在这里插入图片描述

4.3 CSS-in-Js 常用工具之 Styled-js 和 Emot

关于 Styled-js 和 Emotion

  • 在 Typescript 环境下需要扩展 JSX 属性,会带来一些麻烦
  • 优点:用 JS 写,有逻辑有变量,非常灵活
  • 缺点:JSX 和样式代码混在一起,代码较多;增加了编译成本
  • 试用场景:需要灵活变换 CSS 样式

五、总结

综上,具体使用何种 CSS 实现方法,需要根据项目而定。就目前,我接触的项目,可能会更倾向使用 CSS- Module

  • 第一:使用简单,学习成本低
  • 第二:性能更好,CSS-in-Js 会增加编译时间
  • 第三:我暂时接触的项目不需要灵活变换样式

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

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

相关文章

计算机网络 实验七 NAT 和 DHCP 实验

实验目的&#xff1a; 1. 掌握NAT技术的基本原理&#xff0c;熟悉NAT基本配置。 2. 掌握DHCP协议的基本原理&#xff0c;熟悉配置DHCP服务器和中继。 实验过程分析&#xff1a; Nat基本配置 分别写出实验步骤中3&#xff09;、4&#xff09;、6&#xff09;的连通性情况&…

怎样学习C#上位机编程?

怎样学习C#上位机编程&#xff1f; 00001. 掌握C#编程和.NET框架基础。 00002. 学WinForm应用开发&#xff0c;了解控件使用和事件编程。 00003. 熟悉基本数据结构和算法&#xff0c;如链表、栈、队列。 00004. 理解串口通信协议和方法&#xff0c;用于与硬件交互。 00005…

SLAM从入门到精通(数据回放工具之rosbag)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们学习了hector-slam、gmapping slam两种slam方法。当时我们操作的时候&#xff0c;是通过手动操作的方法来建图的。但是这里面可能存在一个…

统信UOS 1060系统新增备份

原文链接&#xff1a;统信UOS 1060系统新增备份 hello&#xff0c;大家好啊&#xff0c;今天给大家带来关于统信UOS 1060系统备份还原的系列内容的第二篇文章&#xff0c;系统新增备份&#xff0c;我们可以将系统新增备份到u盘中&#xff0c;后面需要的话&#xff0c;可以进行还…

Raven2靶机渗透

1. 信息收集 1.1 主机探测 sudo arp-scan -l1.2 端口扫描 nmap -p- -A 192.168.16.185开放了80端口&#xff0c;尝试登录网址查看信息&#xff0c;通过浏览器插件找出指纹 1.3 目录扫描 访问登录界面&#xff0c;发现remember Me怀疑是shiro界面 登录/vendor/界面&#xff0…

springboot中如何进行测试用例数据的随机设定

测试用例数据设定 测试用例数据通常采用随机值进行测试&#xff0c;使用SpringBoot提供的随机数为其赋值 1.在application.yml中设置随机值 testcast:book:id: ${random.int} # 随机整数id2: ${random.int(10)} # 10以内随机数type: ${random.int(10,20)} # …

谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)rust解法

有一个5*5的网格&#xff0c;其中恰好有一个格子是空的&#xff0c;其他格子各有一个字母。一共有4种指令&#xff1a;A, B, L, R&#xff0c;分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列&#xff08;以数字0结束&#xff09;&#xff0c;输出指…

模板进阶和反向迭代器

文章目录 模板非类型模板参数模板特化函数模板特化类模板特化 模板分离编译 反向迭代器 模板 非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c…

黑龙江省人口与社会经济数据集(2015-2016年)

摘要 a. 数据内容&#xff08;数据文件/表名称&#xff0c;包含的观测指标内容&#xff09; 黑龙江省人口与社会经济数据集&#xff08;2015-2016年&#xff09;反映了黑龙江省社会经济、人口和劳动力、农业生产、金融、旅游、卫生、教育、社会保障等情况&#xff0c;包含年末…

MTC证书|欧盟与英国金属类产品清关新要求

英国禁止进口俄钢材的通告内容 从2023年 9 月 30 日起&#xff0c;欧盟和英国将对在第三国加工的特定钢铁产品实施新的制裁&#xff0c;这些产品包含俄罗斯原产的钢铁原料。进口商需要在进口时申报进口货物是否合规。 MTC认证 欧盟严抓MTC认证 获悉&#xff0c;从10月1日起&a…

倒置边框半径卡片

效果展示 CSS 知识点 实现多曲面的思路 实现整体布局 <div class"card"><div class"img_box"></div><div class"content"><div class"price"></div></div> </div>.card {position…

微信小程序入门开发教程

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《微信小程序开发实战》。&#x1f3af;&#x1f3a…

【LeetCode】11. 盛最多水的容器

1 问题 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器…

[自用] win 10安装cuda 10.2和cuDNN 10.2

之前已经安装cuda 10.0和cuDNN 10.0 参考博文&#xff1a; https://blog.csdn.net/qq_50677040/article/details/132131346 https://blog.csdn.net/weixin_67615387/article/details/128807503 安装目录&#xff1a; cmd验证

Android百度地图sdk设置Marker不同颜色

使用百度地图sdk&#xff0c;在地图上画一个marker图标很简单&#xff0c;如下 private fun drawMark(point: LatLng){var resId R.mipmap.icon_device//这个资源是一张图片//构建Marker图标val bitmap BitmapDescriptorFactory.fromResource(resId)//构建MarkerOption&#…

计算机视觉:池化层的作用是什么?

本文重点 在深度学习中,卷积神经网络(CNN)是一种非常强大的模型,广泛应用于图像识别、目标检测、自然语言处理等领域。而池化层作为CNN中的一个关键步骤,扮演着优化神经网络、提升深度学习性能的重要角色。本文将深入探讨池化层的作用及其重要性,帮助读者更好地理解和应…

计算机网络 实验四 子网划分(网络层)

实验目的&#xff1a; 通过实验掌握下列知识&#xff1a; ① 熟悉子网掩码算法和网关&#xff0c;掌握子网划分方法。 ② 了解路由器的作用&#xff0c;掌握静态路由的基本配置。 实验过程分析&#xff1a; 静态路由基本配置 按照拓扑图接线【截图】。PC_1和PC_2设置IP地址…

实时美颜技术的崭新时代:美颜SDK开发与应用

美颜技术的崭新时代已经来临&#xff0c;实时美颜SDK的开发和应用成为数字世界中不可或缺的一部分。从社交媒体到视频直播&#xff0c;实时美颜技术已经在各种应用中取得了广泛成功&#xff0c;吸引了数百万用户。本文将深入探讨实时美颜技术的发展、SDK的开发&#xff0c;以及…

计算机网络 实验五 RIP与OSPF实验(网络层算法)

实验目的&#xff1a; 通过实验掌握下列知识&#xff1a; 1. 掌握RIP路由协议基本原理&#xff0c;熟悉RIP协议基本配置。 2. 掌握OSPF路由协议基本原理&#xff0c;熟悉配置单区域OSPF。 实验过程分析&#xff1a; RIP协议基本配置 按照拓扑图接线【截图】。对RTA进行RI…

java智慧停车系统源码

java智慧停车系统源码 技术架构&#xff1a; 后端开发语言java&#xff0c;采用最新springcloudalibaba版本开发&#xff0c;框架oauth2springboot2.6(可升级到3.0)doubble3.2&#xff0c;使用nacos, seata&#xff0c;sentinel&#xff0c;&#xff0c;数据库mysql/mongodb/…