styled-components 库的用法介绍和实践总结
styled-components 库的实践用法总结
前言
前段时间开发了一个 NiceTab 浏览器插件,并写了一篇介绍文章,新开发了一款浏览器Tab管理插件,OneTab 的升级替代品, 欢迎品尝!。
在插件中用到了 styled-components 这个库,于是做一个基本的介绍和分享。
在开发 NiceTab 插件时,只是一些粗浅的使用,整理完这篇使用笔记后,我准备优化一波了。
styled-components 库介绍
什么是 styled-components
styled-components 是一个流行的 CSS-in-JS 库, 它允许您在 JavaScript 中编写 CSS 样式,是 CSS-in-JS 方案中的一种实现方式。
styled-components is the result of wondering how we could enhance CSS for styling React component systems. By focusing on a single use case we managed to optimize the experience for developers as well as the output for end users.
- 官方文档: 官方文档
- Github: Github
为什么要使用 styled-components
我们看看官网介绍:
Automatic critical CSS- 自动关键CSS: 完全自动地跟踪页面上呈现的组件并注入它们的样式。结合代码分割,按需加载。No class name bugs- 不存在类名冲突问题: 生成唯一的类名。不用担心类名重复、冲突、覆盖以及拼写错误等问题。Easier deletion of CSS- 便于样式剔除: 传统的编写样式方式很难检测样式和类名是否被使用。而styled-components会与特定的组件关联,在工程化项目中,构建工具可以轻易的检测到样式组件是否被使用,未被使用的样式组件会被剔除,避免无用代码打包到构建产物中。Simple dynamic styling- 易于编写动态样式:styled-components样式组件可以根据 props 和全局主题来动态调整样式,无需手动管理众多样式类。Painless maintenance- 便于维护: 不需要查找众多文件来排查组件样式,降低维护成本。Automatic vendor prefixing- 自动添加厂商前缀: 您只需要编写标准的 CSS 样式,其他的事情styled-components自动帮您处理。
传统 CSS 方式的缺点:
- 缺乏作用域,全局样式污染,容易出现类名冲突,样式覆盖问题,出现问题难以排查。需要通过
namespace命名空间、书写顺序、优先级等方式来缓解。 - 原生 CSS 在没有
scss,less等预处理器的情况下,编写起来非常痛苦。 - 实现动态样式,需要预先定义多个类名,为不同类目编写对应的样式,然后根据情况动态绑定不同的类名。
开发中感受:
- 编写一个功能组件,可能只需要添加少许样式 (现在的项目大多都会使用 UI 组件库,自带各种样式),为此而创建一个 css 文件不划算,还可能会有全局样式污染。只需要在该功能组件中定义一个
styled-components样式组件即可。 - 在 html 标签元素书写行内样式或者绑定 style 变量都难以定义伪类样式和复杂选择器(如:
:hover,:before,:after,:first-child,&选择器,+选择器等等) - 如果编写的功能组件需要编写的样式比较多,可以抽取到一个
js或ts文件中,然后引入即可,因为styled-components定义的都是 js 对象。 - 支持 scss 风格的语法。
- 快速定位样式定义代码:传统的方式,需要全局搜索元素类名,才能定位到样式代码。而 js 方式的定义,编辑器能快速跳转定位。
styled-components 的缺点:
- 生成的类名是一串 hash 值, 会绑定到对应的 dom 标签上,难以定位元素,建议给
styled-components样式组件都添加一个 class 样式名,便于识别。
其他 css-in-js 方案
使用 css-in-js 方案的库,比较常见的还有 emotion 和 jss, 大家可以自行尝试使用。
styled-components 的基本使用
安装
- npm 安装:
npm install styled-components - pnpm 安装:
pnpm add styled-components - yarn 安装:
yarn add styled-components
如果您使用像
yarn这种支持 package.json 的 resolutions 字段的包管理器,强烈建议您向其中添加一个与主版本对应的入口配置。这有助于避免因项目中安装了多个版本的styled-components而引起的一系列问题。
基本用法
参考链接:getting-started
先上一个示例:
import styled from "styled-components";
// 创建一个 Title 样式组件,使用 <h1> 标签
const Title = styled.h1`font-size: 24px;text-align: center;color: #fff;
`;// 创建一个 Wrapper 样式组件,使用 <section> 标签
const Wrapper = styled.section`padding: 30px;background: #000;
`;// 在 jsx 中使用
export default function App() {return (<Wrapper><Title>Hello World!</Title></Wrapper>);
}
使用起来挺简单的,除了上面示例中的 h1 和
相关文章:
styled-components 库的用法介绍和实践总结
styled-components 库的实践用法总结 前言 前段时间开发了一个 NiceTab 浏览器插件,并写了一篇介绍文章,新开发了一款浏览器Tab管理插件,OneTab 的升级替代品, 欢迎品尝!。 在插件中用到了 styled-components 这个库,于是做一个基本的介绍和分享。 在开发 NiceTab 插件…...
SSE(Server-Sent Events)主动推送消息
说明 使用Java开发web应用,大多数时候我们提供的接口返回数据都是一次性完整返回。有些时候,我们也需要提供流式接口持续写出数据,以下提供一种简单的方式。 SSE(Server-Sent Events) SSE 是一种允许服务器单向发送事…...
pandas.core.frame.DataFrame怎么进行对象内容的读写
在 Python 中,pandas.core.frame.DataFrame 是 Pandas 数据库的核心数据结构,可以方便地读取和操作表格数据。以下是几种常见的读取内容的方法: 读取特定列 通过列名获取数据。 # 假设 df 是一个 DataFrame data df["列名"] # …...
短作业优先调度算法
一、实验目的 了解并掌握作业调度的功能,熟悉并掌握各种作业调度算法。 二、实验内容 模拟实现SJF调度。 设置作业体:作业名,作业的到达时间,服务时间,作业状态(W——等待,R——运行,F——完成)…...
SpringBoot 应用并发处理请求数的深入解析
SpringBoot 应用并发处理请求数的深入解析 一、引言 在现代Web开发中,了解一个应用程序可以同时处理多少个并发请求是至关重要的。 对于基于Spring Boot构建的应用程序来说,这个问题的答案并非绝对,而是取决于多个因素,包括但不…...
MetaGPT中的教程助手:TutorialAssistant
1. 提示词 COMMON_PROMPT """ You are now a seasoned technical professional in the field of the internet. We need you to write a technical tutorial with the topic "{topic}". """DIRECTORY_PROMPT (COMMON_PROMPT "…...
介绍一款docker ui 管理工具
http://vm01:18999/main.html 管理员登陆账号 jinghan/123456 ui启动命令所在文件夹目录 /work/docker/docker-ui 参考链接 DockerUI:一款功能强大的中文Docker可视化管理工具_docker ui-CSDN博客...
0022 基于SpringBoot的婚纱摄影线上预约系统的设计与实现
电子商城系统 1.项目描述2. 绪论2.1 研究背景2.2 目的及意义2.3 国内外研究现状 3.需求分析4.界面展示5.源码获取 1.项目描述 摘 要 本文旨在研究并开发一套基于Spring Boot框架的婚纱摄影线上预约系统,以满足现代婚纱摄影行业对高效、便捷、个性化服务的需求。该系…...
uni-app在image上绘制点位并回显
在 Uni-app 中绘制多边形可以通过使用 Canvas API 来实现。Uni-app 是一个使用 Vue.js 开发所有前端应用的框架,同时支持编译为 H5、小程序等多个平台。由于 Canvas 是 H5 和小程序中都支持的 API,所以通过 Canvas 绘制多边形是一个比较通用的方法。 1.…...
Comparator.comparing 排序注意
1. 对数字型字符串排序 List<String> values new ArrayList<>();values.add("10");values.add("6");values.add("20");values.add("30");values.add("50");//方法1 (正确的排序方法)//倒…...
PPO系列3 - PPO原理
On Policy: 采集数据的模型,和训练的模型,是同一个。缺点:慢,生成一批样本数据,训练一次,又要重新生成下一批。 Off Policy: 采集数据的模型,和训练的模型,不是同一个。有点…...
.idea
.idea/ 文件夹下的文件和目录主要用于存储 JetBrains IDE(如 PyCharm、IntelliJ IDEA 等)的项目配置。下面是一些常见文件和目录及其作用的详细介绍: 1. workspace.xml 用户界面布局:保存了IDE窗口布局,包括打开的文…...
单片机:实现呼吸灯(附带源码)
单片机实现呼吸灯详细解读 呼吸灯是一种常见的灯光效果,广泛应用于电子产品、汽车、家居照明等领域。其基本特性是通过逐渐增亮和减弱的方式,使得灯光呈现出“呼吸”的效果,给人一种平缓、舒适的视觉感受。在嵌入式系统中,呼吸灯…...
PostgreSQL数据库序列信息查询
PostgreSQL序列信息查询 说明: 在PostgreSQL数据库中序列和表都是序列的对象。 数据库中不应该存在孤儿序列,序列应该和表对应的字段绑定起来。绑定后删除表或表对应的字段后,序列会自动被删除。 创建测试表和序列 create table test_t(…...
【Linux】Nginx一个域名https一个地址配置多个项目【项目实战】
👨🎓博主简介 🏅CSDN博客专家 🏅云计算领域优质创作者 🏅华为云开发者社区专家博主 🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入!…...
Linux驱动开发(12):中断子系统–按键中断实验
本章我们以按键为例讲解在驱动程序中如何使用中断, 在学习本章之前建议先回顾一下关于中断相关的裸机部分相关章节, 这里主要介绍在驱动中如何使用中断,对于中断的概念及GIC中断控制器相关内容不再进行讲解。 本章配套源码和设备树插件位于“…...
代码随想录-算法训练营-番外(图论02:岛屿数量,岛屿的最大面积)
day02 图论part02 今日任务:岛屿数量,岛屿的最大面积 都是一个模子套出来的 https://programmercarl.com/kamacoder/0099.岛屿的数量深搜.html#思路往日任务: day01 图论part01 今日任务:图论理论基础/所有可到达的路径 代码随想录图论视频部分还没更新 https://programmercar…...
20 go语言(golang) - gin框架安装及使用(一)
一、简介 Gin是一个用Go语言编写的高性能Web框架,专注于构建快速、可靠的HTTP服务。它以其速度和简洁性而闻名,非常适合用于开发RESTful API。 高性能:Gin使用了httprouter进行路由管理,这是一个轻量级且非常快速的HTTP请求路由器…...
重生之我在学Vue--第3天 Vue 3 模板语法与指令
重生之我在学Vue–第3天 Vue 3 模板语法与指令 文章目录 重生之我在学Vue--第3天 Vue 3 模板语法与指令前言一、数据绑定1.1 单向绑定1.2 双向绑定 二、常用指令2.1 v-bind2.2 v-model2.3 v-if2.4 v-show2.5 v-for2.6 v-on 三、事件处理与表单绑定3.1 事件处理3.2 表单绑定 前言…...
电脑win11家庭版升级专业版和企业版相关事项
我的是零刻ser9,自带win11家庭版,但是我有远程操控需求,想用windows系统自带的远程连接功能,所以需要升级为专业版。然后在系统激活页面通过更改序列号方式,淘宝几块钱买了个序列号升级成功专业版了。但是,…...
基于MATLAB的buck-boost升降压斩波电路系统设计 本设计包括设计报告,仿真工程
基于MATLAB的buck-boost升降压斩波电路系统设计 本设计包括设计报告,仿真工程。 Buck-Boost斩波电路是一种特殊的DC-DC转换器,它具备独特的功能,能够灵活地处理输入电压与输出电压之间的关系。 这种电路不仅能够将输入电压降至低于输出电压的…...
事件驱动RTOS EventOS的创新设计与应用实践
1. 事件驱动型RTOS的创新设计 在嵌入式系统开发领域,实时操作系统(RTOS)一直是关键基础设施。传统RTOS如FreeRTOS、uC/OS等大多采用基于时间片轮转的任务调度机制,而EventOS则开创性地采用了事件驱动架构,这在资源受限的嵌入式环境中具有独特…...
【空气涡轮发动机Matlab_simulink动态仿真模型 ✔【空气涡轮发动机Matlab_simulink动态仿真模型】 1、部件级模型;进气道,涡轮,气室,压气机,尾喷管,转子模块,容积模块 2、
【空气涡轮发动机Matlab/simulink动态仿真模型 ✔【空气涡轮发动机Matlab/simulink动态仿真模型】 1、部件级模型;进气道,涡轮,气室,压气机,尾喷管,转子模块,容积模块 2、PID控制器: 输出扭矩阶跃扰动下&am…...
Java函数计算部署实战:从本地调试到生产环境上线的7个关键步骤(含阿里云/华为云/AWS对比)
第一章:Java函数计算部署全景概览Java函数计算是云原生场景下轻量级、事件驱动型服务的重要实现方式。它将传统Java应用的部署范式从虚拟机/容器迁移至按需执行、自动扩缩的无服务器架构,显著降低运维复杂度与资源闲置成本。开发者只需聚焦业务逻辑&…...
小白程序员必看:收藏这份RAG大模型核心技术原理详解,轻松入门智能Agent
1. 核心流程全景图RAG 的生命周期可以严格划分为两个平行的工作流:离线数据处理流(Data Pipeline) 和 在线检索生成流(Query Pipeline)。RAG 核心工作流 1.1 离线数据处理流(Data Ingestion) 这…...
手把手教你用CH32V208开发板实现蓝牙BLE5.3通信(附完整工程源码)
基于CH32V208开发板的蓝牙BLE5.3实战开发指南 在物联网设备爆发式增长的今天,低功耗蓝牙(BLE)技术因其低功耗、低成本的优势,成为短距离无线通信的首选方案之一。作为一款集成了BLE5.3模块的RISC-V微控制器,CH32V208为…...
ZFAKA发卡网搭建避坑实录:从YAF扩展安装到目录权限,我踩过的雷你别再踩了(Linux环境)
ZFAKA发卡网Linux搭建实战:关键问题解析与深度排雷指南 第一次在Linux上部署ZFAKA时,我本以为按照教程半小时就能搞定,结果却花了整整两天时间与各种报错信息搏斗。从YAF扩展的诡异报错到目录权限引发的连锁反应,每个环节都暗藏杀…...
SiameseAOE中文-base多场景落地:电商、酒店、教育评论情感结构化实践
SiameseAOE中文-base多场景落地:电商、酒店、教育评论情感结构化实践 1. 引言:从海量评论中挖掘价值 你有没有遇到过这样的烦恼?面对成千上万条用户评论,想了解大家对产品、服务到底满不满意,却无从下手。一条条看&a…...
AndroidTVLauncher自定义功能卡片开发:FunctionCardPresenter实现原理与实践
AndroidTVLauncher自定义功能卡片开发:FunctionCardPresenter实现原理与实践 【免费下载链接】AndroidTVLauncher This is a leanback style tv launcher(minSdkVersion 17) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidTVLauncher AndroidTVLaunch…...
RTKLIB解算精度上不去?可能是这5个RTKNAVI选项你没调对(附参数优化建议)
RTKLIB解算精度优化实战:5个关键参数设置与场景化调优指南 当你已经能够熟练运行RTKNAVI完成基本定位解算,却发现动态RTK结果总在浮点解徘徊、固定率忽高忽低,或是基线稍长就精度骤降时,问题往往藏在那些容易被忽略的高级参数里。…...
