React中使用外部样式的3种方式(小结)


Posted in Javascript onMay 28, 2019

一、关于css-in-js的认识

1、css-in-js是一种使用 js 编写 css 样式的 css 处理方案。它的实现方案有很多,比如styled-components、polished、glamorous(paypal 开源的,不再维护)、radium、emotion等等。

2、其中最成熟的便是styled-components和emotion。它们真正意义上实现了组件化style,可以说是专门为 react 打造的。

二、styled-components 简介

styled-components是 css-in-js 主流的实现方案,同时也是组件化style的主流实现方案。

下面是styled-components的一些特性:

1、唯一class类名:和 css-module 异曲同工,生成唯一类名,避免重复和全局污染,也不需要你费脑筋思考该如何命名。

2、无冗余css代码:它的样式和组件绑定,组件调用则样式起作用。意味着你不需要关心如何检测和删除那些未使用的 css 代码。

3、动态样式: 它可以很简单地调整和拓展组件的样式,而不需要建立很多个 class 类来维护组件的样式。

4、自动添加兼容前缀:和 Autoprefixer 类似,会自动添加浏览器兼容前缀以支持旧版浏览器。

5、支持变量和继承:你可以使用变量来设置不同的样式,使用这些不同样式时只需要给样式组件传递一个参数即可。

三、styled-components使用方式

1、安装

npm install styled-components

2、使用

styled-components主要基于 es6 的标签模板语法调用标签函数

import React, { Component } from 'react'
import styled from 'styled-components'

export default class Style extends Component {
 render() {
  return (
   <>
    <div>
     <Title>我是标题</Title>
    </div>
   </>
  )
 }
}

// 使用es6的模板字符串的方式(下面表示定义了h1的样式)
const Title = styled.h1`
 font-size: 20px;
 color: #f00;

3、嵌套的使用

import React, { Component } from 'react'
import styled from 'styled-components'

export default class Style extends Component {
 render() {
  return (
   <>
    <div>
     <Content>
      <h2>你好</h2>
      <div className="content">我是内容</div>
     </Content>
    </div>
   </>
  )
 }
}

const Content = styled.div`
 width: 100%;
 height: 500px;
 border: 1px solid #f00;
 > h2 {
  color: pink;
 }
 > .content {
  text-align: center;
  color: #f00;
 }
`

4、使用props传递参数的方式

import React, { Component } from 'react'
import styled, { css } from 'styled-components'

export default class Style2 extends Component {
 render() {
  return (
   <div>
    <Button> 提交 </Button>
    <Button primary> 提交 </Button>
   </div>
  )
 }
}

const Button = styled.button`
 font-size: 1em;
 margin: 1em;
 padding: 0.25em 1em;
 border-radius: 5px;
 color: palevioletred;
 border: 2px solid palevioletred;
 cursor: pointer;

 ${props =>
  props.primary &&
  css`
   border: 2px solid mediumseagreen;
   color: mediumseagreen;
  `}
`

5、样式的继承

import React, { Component } from 'react'
import styled from 'styled-components'

export default class Style3 extends Component {
 render() {
  return (
   <div>
    <Button> 提交 </Button>
    <ExtendingButton> 提交 </ExtendingButton>
   </div>
  )
 }
}

const Button = styled.button`
 background: palevioletred;
 color: white;
`

const ExtendingButton = styled(Button)`
 font-size: 18px;
 padding: 5px 25px;
`

四、使用sass

使用create-react-app创建的项目是支持sass的但是需要自己安装

1、安装

npm install node-sass

2、直接使用

import React, { Component } from 'react'
import './style4.scss'

export default class Style4 extends Component {
 render() {
  return (
   <div>
    <div className="title">我是标题</div>
   </div>
  )
 }
}

五、使用css-module

使用create-react-app创建的项目,默认情况下就支持css-module

1、样式文件必须以[name].module.css或[name].module.scss的形式命名

2、以变量的形式导入样式文件,比如 import styles from './style.module.css';

3、className以变量引用的方式添加,比如 className={ styles.title }

import React, { Component } from 'react'
import styles from './Style5.module.scss'

export default class Style5 extends Component {
 render() {
  return (
   <div>
    <div className={styles.title}>我是标题</div>
   </div>
  )
 }
}
<div class="Style5_title__lsl4D"></div>

4、如果不想使用默认的哈希值

:global(.wrap) {
 color: green;
}
// 直接使用
<h2 className="wrap">你好</h2>

5、样式的继承

.className {
 color: green;
 background: red;
}

.otherClassName {
 composes: className; // 直接继承上面的
 color: yellow;
}

.title {
 composes: className from './another.css'; // 直接使用外部样式表
 color: red;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js单例模式的两种方案
Oct 22 Javascript
解析Javascript中难以理解的11个问题
Dec 09 Javascript
javascript确认框的三种使用方法
Dec 17 Javascript
JQuery调用绑定click事件的3种写法
Mar 28 Javascript
Bootstrap carousel轮转图的使用实例详解
May 17 Javascript
js实现股票实时刷新数据案例
May 14 Javascript
使用jQuery实现动态添加小广告
Jul 11 jQuery
vue-ajax小封装实例
Sep 18 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
Feb 05 Javascript
解决vue中修改了数据但视图无法更新的情况
Aug 27 Javascript
vue-cli项目配置多环境的详细操作过程
Oct 30 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
Jun 13 Javascript
vue实现多条件和模糊搜索功能
May 28 #Javascript
vue实现路由切换改变title功能
May 28 #Javascript
Vue 无限滚动加载指令实现方法
May 28 #Javascript
vue实现搜索过滤效果
May 28 #Javascript
微信小程序 image组件遇到的问题
May 28 #Javascript
vue实现搜索功能
May 28 #Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
May 28 #Javascript
You might like
模仿OSO的论坛(四)
2006/10/09 PHP
php 图片上传类代码
2009/07/17 PHP
PHP网站备份程序代码分享
2011/06/10 PHP
深入PHP操作MongoDB的技术总结
2013/06/02 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
写js时遇到的一些小问题
2010/12/06 Javascript
JavaScript性能陷阱小结(附实例说明)
2010/12/28 Javascript
基于jQuery的动态表格插件
2011/03/28 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
javascript 事件处理示例分享
2014/12/31 Javascript
jQuery+easyui中的combobox实现下拉框特效
2015/02/27 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
详解nodejs 文本操作模块-fs模块(一)
2016/12/22 NodeJs
取消Bootstrap的dropdown-menu点击默认关闭事件方法
2018/08/10 Javascript
在Angular中使用JWT认证方法示例
2018/09/10 Javascript
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
[01:13]2014DOTA2西雅图邀请赛 舌尖上的TI4
2014/07/08 DOTA
[36:20]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.17
2020/12/18 DOTA
Python多线程实例教程
2014/09/06 Python
详解Python中的__new__()方法的使用
2015/04/09 Python
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
简介Django中内置的一些中间件
2015/07/24 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
python输出决策树图形的例子
2019/08/09 Python
学Python 3的理由和必要性
2019/11/19 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
基于opencv的selenium滑动验证码的实现
2020/07/24 Python
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
Html5原生拖拽相关事件简介以及基础实现
2020/11/19 HTML / CSS
土耳其新趋势女装购物网站:Addax
2020/01/07 全球购物
高中生毕业学习总结的自我评价
2013/11/14 职场文书
后勤采购员岗位职责
2013/12/19 职场文书
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL