总结react中css的使用

news/2025/2/22 15:49:10/

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.ppmy.cn/news/1255778.html

相关文章

目标检测YOLO系列从入门到精通技术详解100篇-【图像处理】图像识别

目录 知识储备 OpenCV中的图像形态学 基于图像识别的水位测量 目标图像的提取和预处理

论文编写软件latex安装教程

目录 1.下载安装包2.安装texlive 本人系统为windows&#xff0c;本教程基于windows系统&#xff0c;如果是其它系统请参考对应教程&#xff0c;注意选择对应系统的安装包&#xff01; 1.下载安装包 有三种集成环境安装包 texlive 是主流的环境&#xff0c;集成了较多的包&…

python爬虫AES魔改案例:某音乐素材下载网

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、找出需要加密的参数 js运行 atob(‘aHR0cHM6Ly93d3cuYWlnZWkuY29tL3NvdW5kL2NsYXNzLw’) 拿到网址&#xff0c;F12打开调…

【数电笔记】18-卡诺图化简

目录 说明&#xff1a; 用卡诺图化简逻辑函数 1. 公式法化简与卡诺图化简对比 2. 化简依据 3. 化简规律 3.1 两个小方块相邻 3.2 四个小方块相邻 3.3 八个小方块相邻 4. 卡诺图化简法步骤 4.1 例1 4.2 例2 5. 画卡诺圈规则 5.1 例1 6. 特殊情况 6.1 例1 6.2 例…

力扣226:翻转二叉树

力扣226&#xff1a;翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;root [2,1,3]…

Web前端JS如何控制 Video/Audio 视音频声道(左右声道|多声道)、视音频轨道、音频流数据

写在前面&#xff1a; 接上篇博文&#xff1a;Web前端JS如何获取 Video/Audio 视音频声道(左右声道|多声道)、视音频轨道、音频流数据 讲解了如何根据视频链接地址&#xff0c;实现在播放时实时的显示该视频的音频轨道情况&#xff0c;并实时的将各音频轨道数据以可视化&#x…

Google Earth Engine谷歌地球引擎计算多年中某两个时间点之间遥感数据差值的平均值

本文介绍在谷歌地球引擎GEE中&#xff0c;提取、计算某一种遥感影像产品在连续的多年中&#xff0c;2个不同时相的数据差值的多年平均值&#xff0c;并将计算得到的这一景差值的结果图像导出的方法。 本文是谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#x…

抓取检测(Grasp Dection)

抓取检测 抓取检测被定义为能够识别任何给定图像中物体的抓取点或抓取姿势。抓取策略应确保对新物体的稳定性、任务兼容性和适应性&#xff0c;抓取质量可通过物体上接触点的位置和手的配置来测量。为了掌握一个新的对象&#xff0c;完成以下任务&#xff0c;有分析方法和经验…