热门标签 | 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内容放到






















扫二维码
















































推荐阅读
  • 深入浅出 webpack 系列(二):实现 PostCSS 代码的编译与优化
    在前一篇文章中,我们探讨了如何通过基础配置使 Webpack 完成 ES6 代码的编译。本文将深入讲解如何利用 Webpack 实现 PostCSS 代码的编译与优化,包括配置相关插件和加载器,以提升开发效率和代码质量。我们将详细介绍每个步骤,并提供实用示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • Webpack 初探:Import 和 Require 的使用
    本文介绍了 Webpack 中 Import 和 Require 的基本概念和使用方法,帮助读者更好地理解和应用模块化开发。 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom"echarts";4、如果用到map(地图),还 ... [详细]
  • Bootstrap 插件使用指南
    本文详细介绍了如何在 Web 前端开发中使用 Bootstrap 插件,包括自动触发插件的方法、插件的引用方式以及具体的实例。 ... [详细]
  • 本文详细介绍如何在忘记MySQL服务器密码的情况下进行密码重置,包括具体的步骤和注意事项。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 本文深入探讨了MDK链接脚本的应用与优化技巧。首先,文章介绍了链接脚本的基本概念及其在嵌入式系统开发中的重要性。接着,通过具体实例详细分析了链接脚本的结构和功能,特别是在程序在FLASH中运行时,如何优化链接脚本以提高系统性能。此外,文章还讨论了无需将程序加载到SRAM中的技术细节,为开发者提供了实用的参考和指导。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
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社区 版权所有