侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

React中编写CSS的姿势

前端  /  管理员 发布于 6年前   257

在任何环境之下其实没有最佳,最有最适合,那么在react中编写css也是类似的。在react中有很多编写css的方式,在社区中讨论最多的应该是CSS In js 和 CSS Modules。前段时间在《 React中CSS Modules的使用 》一文中探讨了在React中怎么使用CSS Modules来管理组件和项目的CSS。事实上,使用CSS Modules还是存有一定的缺陷。这篇文章将会和大家一起聊聊React中编写CSS的姿势,然后再会花一些篇幅来讨论CSS Modules编写CSS的最佳姿势。


React中编写CSS的系列痛点

其实我自己在React中编写CSS并不多,因为以前都是基于vue的体系来做项目。现在切换到React技术栈,尝试着使用React来构建项目和组件库。到目前为止,我在项目React中使用过两种方式编写CSS:

原生CSS结合处CSS处理器(Sass和PostCSS):该方式样式易于全局污染,多人协作易于发生冲突使用CSS Modules编写CSS,相比原生CSS是舒服多了,但引用组件库(独立库)就有点蛋疼,组件库样式覆盖令人头疼

这只是自己初步的感觉。但@Vjeux在分享CSS-in-js时就抛出了React中编写CSS时令人头痛的一系列问题:

全局污染 :在CSS中,选择器的作用域概念并不太强,其机制虽然方便我们重写样式,但也带来痛楚,易于污染全局命名混乱 :在多人协作(有的时候甚至是自己个人)在维护或开发一个项目的时候,容易造成样式冲突;而且命名混乱,难于维护。虽然BEM可以这种现象更好些,但还是难于避免命名的混乱,特别是在样式多变的情况之下依赖管理不彻底 :组件应该是相互独立的,在引入一个组件时,应该只引入组件所需要的样式。但现在的做法是除了要引入JavaScript之外,还需要引入组件的CSS。不过组件自身无法彻底的管理相关的样式依赖。当然,到目前为止,webpack的一些loader 可以让这方面有所改善无法共享变量 :复杂组件要使用JavaScript和CSS来共同处理样式,比如通过状态来动态更改样式风格。这样就需要通过JavaScript来处理CSS,就会造成有些变量在JavaScript和CSS中冗余。有可能CSS自定义属性会让这方面有所改变,但需相关验证

第一感觉,就编写CSS而言,在vue的体系下要比在React的体系下爽多了。


React中编写CSS常见的方式

在React社区中有关于如何在React中编写CSS的讨论也非常的热烈,而常见的方式是以下几种:

Inline CSSCSS In JSStyled ComponentsCSS Modules

不过每种方式都有自己的利弊,也各有争议。接下来我们先不好坏,分别来体验一下这几种方式写CSS的不同之处。

在开始之前,先使用 Create React APP 来构建React的项目,用来验证React项目中编写CSS的不同之处。

npx create-react-app react-stylingcd react-stylingnpm run start 


React在没有任何其他工具的情况之下,仅支持两种处理样式的方式: style 道具( props )与 <style> 标签和CSS样式表。 style 道具使用JavaScript对象(CSS属性和值),并最终将其转换为元素的内联样式,如下所示:

// JSX<p style={{backgroundColor: 'red'}}>Hello, {props.name}</p>

还可以这样写:

// App Components// JSX<p style={{ backgroundColor: props.color }}>Hello, {props.name}</p>// index.jsimport App from './App';ReactDOM.render(<App name="大漠" color="#306"/>, document.getElementById('root'));


第一种是和我们平时在DOM中的元素上使用 style 属性设置行内样式是一样的;第二种是使用 props 的给 style 设置样式,编译出来也是行内样式。这两种方式输出来的样式都是行内样式,如果从选择器权重来说,它的权重是非常高的,在调用组件,要覆盖其样式就不容易了。

我们还可以在一个样式表文件中设置样式,比如在 App.css 文件中:

.App {    text-align: center;}.App-logo {    animation: App-logo-spin infinite 20s linear;    height: 40vmin;    pointer-events: none;}

在 App 组件中可以通过 className 来调用 App.css 中的类名:

// App.jsimport './App.css';function App(props) {    return (        <div className="App">            <header className="App-header">                <img src={logo} className="App-logo" alt="logo" />                <p style={{ backgroundColor: props.color }}>Hello, {props.name}</p>            </header>        </div>    );}

编译出来之后如下图所示:


这是React中编写CSS最基本的方式。这两种基本方式和我们在普通的Web中编写CSS方式是一样的。众所周知,Web中编写CSS是较为痛苦的,因为类名的冲突,全局的污染等等。所以社区才会借助一些工具的方式来改变编写CSS。

在 Vue的体系下有 scoped 和CSS Modules ;在React中编写的方式就更多,即接下来要介绍的这些方式。


Inline CSS

Inline CSS称为内联CSS,即在html标签元素中使用 style 属性( Attribute )来定义CSS属性,常被称为 行内样式 。如下面这样:

<p style="font-size: 20px; color:#4a54f1; text-align:center; padding-top:100px;">    Hello World!!!</p>

而在Web中,我们一直提倡的是结构和样式分离,所以一直不推荐行内样式这样的写法。而如今天在React框架体系中,又开始提 Inline CSS ,那么是不是有点倒退了的意思呢?该话题先不讨论,这里咱们只来聊聊Inline CSS在React中的使用,并且该使用是否适合我们的开发习惯。

在React开发中,我们一般使用JSX编写。JSX将被转换为 React.createElement(...) ,所有的属性都将成为 props 对象的一部分。

有关于JSX的详细介绍,可以阅读《深入了解JSX》一文。

在React中,内联样式不指定为 字符串 。 style 属性接受带有驼峰格式的JavaScript对象。例如:

margin-top       ─➤ marginTopborder-radius    ─➤ borderRadiusfont-weight      ─➤ fontWeightbackground-color ─➤ backgroundColor

下面是React中定义内联CSS的基本步骤:

将CSS属性名称用驼峰的格式编写,比如 font-size 要写成 fontSize创建一个对象,将所有CSS属性作为 key ,CSS属性的值作为 value将该对象分配给 style 属性

我们来尝试着将上面的html代码,看看在React中怎么来实现:

// App.jsimport React from 'react';function App() {    const styleObj = {        fontSize: '20px',        color: '#4a54f1',        textAlign: 'center',        paddingTop: '100px'    }    return (        <p style={ styleObj }>Hello World!!!</p>    );}export default App;// index.jsimport React from 'react';import ReactDOM from 'react-dom';import App from './App';ReactDOM.render(<App />, document.getElementById('root'));

你将看到的效果如下:


上面的写法和JSX中在 style 中引入需要的样式得到的结果是一样的

原文:https://www.w3cplus.com/react/how-to-write-css-in-react.html



  • 上一条:
    vue项目接入mock&amp;&amp; axios 通用配置
    下一条:
    Vue仿微信app页面跳转动画
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客