热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

react_Reactcssinjs

本文由编程笔记#小编为大家整理,主要介绍了Reactcss-in-js相关的知识,希望对你有一定的参考价值。
本文由编程笔记#小编为大家整理,主要介绍了React css-in-js相关的知识,希望对你有一定的参考价值。














1







 传统class的痛点









随着React、Vue等支持组件化的MVVM前端框架越来越流行,在js中直接编写css的技术方案也越来越被大家所接受。




为什么前端开发者们更青睐于这些css-in-js的方案呢?我觉得关键原因有以下几点:






1.css在设计之初对“组件化”的考虑是不完全的,css直接作用于全局,无法直接作用于某个组件内部的样式。


2.在我们的前端组件中有很多“组件样式随着数据变化”的场景,但传统css应对这种场景很无力。


3.虽然我们可以通过一些规范来规避问题,但是真正用起来太繁琐了,也不利于跨团队的写作。






比如一个遵循BEM规范的表单组件要写成这个样子:










10  


11  


12








实在是太繁琐了!如果这是一段业务代码(注意,是业务代码),那团队中的其他人去读这段代码的时候内心一定是比较崩溃的。当然,如果是维护基础组件的话,遵守BEM规范「块(block)、元素(element)、修饰符(modifier)」还是非常重要的。















2







React中编写css的几种方式















2-1、有规范约束的className





























使用一些命名规范(比如BEM规范)来约束className,比如下面这种:








1  // style.css


2  .form {


3    background-color: white;


4  }


5  .form__input {


6    color: black;


7  }


8


9  import './stype.css'


10 const App = props => {


11   return (


12    


13      


14    


15   )


16 }








1、使用class开发的组件库,业务方可以很方便地由组件样式的覆盖。


2、基础组件库一般由专门的团队开发,命名规范能统一。


3、使用最基础的class,能有效降低组件库的大小。










2-2、inline styling


















React css-in-js















1  const App = props => {


2    return (


3     

123


4    )


5  }








这种方式是JSX语法自带的设置style的方法,会渲染出来内联样式,它有一个好处是可以在style中使用一些全局变量(但实际上,less等css预处理语言也是支持的)。另外,如果你只是要调一下组件的margin,这种写法也是代码量最小的写法。










2-3、css-loader(CSS Module)


















React css-in-js











使用webpack的css-loader可以在打包项目的时候指定该样式的scope,比如我们可以这样打包:








1  // webpack config


2  module.exports = {


3    module: {


4      loaders: [


5        {


6          test: /\.css$/,


7          loader: 'css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]'


8        },


9      ]


10   },


11   ...


12  }












1  // App.css


2  .app {


3      background-color: red;


4  }


5  .form-item{


6    color: red;


7  }












1  import styles from './App.css';


2  const App = props => {


3    return (


4     

123


5     

456


6    )


7  }






 


这样.app就会被编译为.App__app___hash这样的格式了。这种方式是借助webpack实现将组件内的css只作用于组件内样式,相比于直接写inline styling也是一个不错的解决方案。




但使用style['form-item']这种形式去className的值(并且我们单独编写css文件时一般也都会使用“-”这个符号),我觉得不少开发者会觉得很尴尬……




另外虽然webpack支持“-”和驼峰互相转换,但是在实际开发中,如果面对一个样式比较多的组件,在css文件中使用“-”然后在js组件中使用驼峰也是有一定的理解成本的。










2-4、css-in-js


















React css-in-js











顾名思义,css-in-js是在js中直接编写css的技术,也是react官方推荐的编写css的方案,在github.com/MicheleBert… 这个代码仓库中我们可以看到css-in-js相关的package已经有60多个了。



下面以emotion为例,介绍一下css-in-js的方案:








1  import { css, jsx } from '@emotion/core'


2  const color = 'white'


3  // 下面这种写法是带标签的模板字符串


4  // 该表达式通常是一个函数,它会在模板字符串处理后被调用,在输出最终结果前


5  // 我们可以通过该函数来对模板字符串进行操作处理


6  // 详细链接 —— https://developer.mozilla.org/en-US/docs/Web/Javascript/Reference/Template_literals


7  const App = props => {


8    return (


9   

10     className={css`


11       padding: 32px;


12       background-color: hotpink;


13       font-size: 24px;


14       border-radius: 4px;


15     `}


16   >


17     This is test.


18  


19   )


20 }








在开发业务代码的时候,由于维护人员较多且不固定,且代码规模会逐渐增大,不能保证 css 不会交叉影响,所以我们不能只通过规范来约束,而是要通过 css-in-js 这样的方案来解决 css 交叉影响问题。













3







css-in-js方案比较









我们选取了 github.com/MicheleBert… 仓库中支持功能全面且月下载量较多的几个css-in-js方案进行一下比较(其实它们在使用的时候都差距不大,主要是实现原理以及支持的特性有一些不太一样)
















































package




star




gzip size




feature




styled-components




17306




12.5kB




Automatic Vendor Prefixing、Pseudo Classes、Media Queries




emotion




4101




5.92kB (core)




Automatic Vendor Prefixing、Pseudo Classes、Media Queries、Styles As Object Literals、Extract CSS File




radium




6372




23.3kB




Automatic Vendor Prefixing、Pseudo Classes、Media Queries、Styles As Object Literals




aphrodite




4175




7.23kB




Automatic Vendor Prefixing、Pseudo Classes、Media Queries、Styles As Object Literals、Extract CSS File




jss




5900




6.73kB




Automatic Vendor Prefixing、Pseudo Classes、Media Queries、Styles As Object Literals、Extract CSS File








从体积来看:emotion的体积是最小的。




从技术生态环境(以及流行程度):styled-components的star最多,文档相对来讲也是最完善的。




从支持的特性来看:emotion、aphrodite、jss支持的特性是最多的。




所以新人可以尝试接触styled-components,综合来看emotion是一个相当不错的选择。




我们团队其实很早就开始使用React + emotion进行前端开发了。当时选择emotion主要的考虑就是它拥有最全面的功能,以及在当时的css-in-js方案中相对最小的体积。




而且emotion是为数不多的支持source-map的css-in-js框架之一。













4







 emotion实现原理简介















4-1、emotion效果


















React css-in-js











首先让我们来看一下emotion做了什么,这是一个使用了emotion的React组件:








1  import React from 'react';


2  import { css } from 'emotion'


3  const color = 'white'


4  function App() {


5    return (


6     


7        padding: 32px;


8        background-color: hotpink;


9        font-size: 24px;


10       border-radius: 4px;


11       &:hover {


12         color: ${color};


13       }


14     `}>


15       This is emotion test


16    


17   );


18 }


19 export default App;








这是渲染出的html









2   


3     


4     


12   


17 


18 


19   


20     

This is React.js test


21   


22  


23








我们可以看到emotion实际上是做了以下三个事情:






1、将样式写入模板字符串,并将其作为参数传入css方法。


2、根据模板字符串生成class名,并填入组件的class="xxxx"中。


3、将生成的class名以及class内容放到






















扫二维码
















































推荐阅读
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了为什么在main.js中写import不会全局生效的问题,并提供了解决方案。在每一个vue文件中都需要写import语句才能使其生效,而在main.js中写import语句则不会全局生效。本文还介绍了使用Swal和sweetalert2库的示例。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了在使用vue和webpack进行异步组件按需加载时可能出现的报错问题,并提供了解决方法。同时还解答了关于局部注册组件和v-if指令的相关问题。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了一道网络流题目hdu4888 Redraw Beautiful Drawings的解题思路。题目要求以行和列作为结点建图,并通过最大流算法判断是否有解以及是否唯一。文章详细介绍了建图和算法的过程,并强调在dfs过程中要进行回溯。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
author-avatar
mobiledu2502917177
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有