无论你的梦想有多么高远,记住,一切皆有可能。

我们从前面的学习知道一个 React 组件不仅仅只包含 DOM 结构的,还应该样式和 Javascript 逻辑的。这里我们学习下如何构建 CSS 样式。

1. 逻辑表示

JSX 中使用大括号语法来包裹 JS 表达式(简单逻辑代码)。例如:

{ 1 + 1 }
{ 表达式/对象/变量/常量 }

2. 样式表示

React 推荐使用行内样式,因为 React 认为每一个组件都是一个独立的整体。具体样式参考文档:

https://www.runoob.com/css/css-tutorial.html

2.1 行内样式

想给虚拟 DOM 添加行内样式,需要使用表达式传入样式对象的方式实现,注意这里两个括号,第一个表示我们要在 JSX 里插入 JS 了,第二个是样式对象的括号:

import React, { Component } from "react"
import "./1-style.css" class StyleApp extends Component {
render() {
return (
<div>
{ 1+2 }
{/* 行内样式 */}
<div style={{backgroundColor: "red"}}>行内样式第一行数据</div>
{/* 支持外部 CSS 文件 */}
{/* class => className JSX 写法区别 JS 中关键字类 class */}
<div className="active">外部CSS文件样式第二行数据:使用类选择器</div>
{/* 使用 id 选择器 */}
<div id="body">外部CSS文件样式第三行数据:使用id选择器</div> {/* for => htmlFor JSX 写法,同理 class 关键字 */}
<label htmlFor="username">用户名:</label>
<input type="text" id="username"/>
</div>
)
}
} export default StyleApp

2.2 外部 CSS 文件

语法格式和示例:

选择器 {
属性名1: 属性值1,
属性名2: 属性值2,
...
}
// CSS 文件
.active {
background: orange;
} #body {
background: green;
}

CSS 导入原理:

webpack 将 CSS 文件转换成内部样式,加到 style 中,并插到插入到页面的 head 标签里。

import "./1-style.css"

3. 样式描述语言

3.1 CSS

CSS(Cascading Style Sheets,层叠样式表) 文件主要的用途是对网页中字体、颜色、背景、图像及其他各种样式元素的控制,使网页能够完全按照设计者的要求来显示。

3.2 Less

Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量、混合、函数等功能,让 CSS 更易维护、方便制作主题、扩充。

Less 文件最终需要编译成 CSS 文件进行样式的渲染,不过相对比与 CSS,Less 提供了一些额外的功能将有效提高我们开发的效率。

两者之间的区别:

变量:Less 允许单独定义一系列通用的变量,然后在需要的时候去进行调用, 方便更改,提高了代码的复用。示例:

@color: red;
.one{
color:@color;
}
.two{
color:@color;
}
.one{
color:red;
}
.two{
color:red;
}

嵌套:Less 可以使用一个选择器嵌套另外一个选择器,减少代码量。

运算:Less 中提供了加,减,乘,除操作;我们可以做属性值和颜色的运算,这样就可以实现属性值之间的复杂关系。示例:

@color: #333333;
.one{
color:@color+#111111;
}

3.3 Sass

Sass 是一款强化 CSS 的辅助工具,它在 CSS 语法的基础上增加了变量 (variables)、嵌套 (nested rules)、混合 (mixins)、导入 (inline imports) 等高级功能,这些拓展令 CSS 更加强大与优雅。使用 Sass 以及 Sass 的样式库(如 Compass)有助于更好地组织管理样式文件,以及更高效地开发项目。

Less 和 Sass 如何选择:

https://so66.cn/102540.html

4. CSS Module 模块化

CSS 是层叠样式表(Cascading Style Sheets)的简称。用于渲染 HTML 式样的。 CSS 的读取是有自己的规则的,从右至左。当项目大点,类名相同时,难免会发生覆盖。从代码中看,明明已经设置了,但是为什么不起作用呢?为了解决这种问题,于是有了 CSS Modules 方案。

CSS 的模块化,这样的方式可以区分各个组件的样式,不会相互覆盖,而且还能定义伪类,React 脚手架当中内置了 CSS Modules 的配置,我们可以直接将 CSS 的文件定义为 xxx.module.css,在 xxx.module.css 文件中,还是按照以前的 CSS 编写方式编写,不同点在于 jsx 页面中定义 className,先引入该 css 文件,然后定义类名以对象的形式定义:

import style from './index.module.css'
return(<div className={style.title}>
hello react
</div>)

这样定义的样式是一个不会重复的字符。这种定义样式的方式能够比较有效的解决样式重叠的问题,麻烦之处就是每次编写样式的时候需要通过对象的语法来定义,并且不支持动态的设置样式。

其次上面提到到 Less(Leaner Style Sheets 的缩写) 是一门向后兼容的 CSS 扩展语言。也可以解决上面提到的覆盖问题。

5. styles-components

它是通过 JavaScript 改变 CSS 编写方式的解决方案之一,从根本上解决常规 CSS 编写的一些弊端。通过 JavaScript 来为 CSS 赋能,我们能达到常规 CSS 所不好处理的逻辑复杂、函数复杂、函数方法、复用、避免干扰。样式书写将直接依附在 JSX 上面,HTML、CSS、JS 三者再次内聚。all in js 的思想。模块安装如下:

npm i styled-components

5.1 基础应用

style.label 会在原生组件基础上生成一个带样式的组件,原生组件本身的属性还是存在的,可以透传给组件内部。

import styled from 'styled-components'

export default class StyleComponent extends Component {
render() {
const StylesLebel = styles.label`
background: red
`
return (
<div>
<StylesLebel>StyleComponent</StylesLebel>
</div>
)
}
}

5.2 透传 props

import styled from 'styled-components'

export default class StyleComponent extends Component {
render() {
const StylesLebel = styles.label`
background: ${props=>props.bg}
`
return (
<div>
<StylesLebel bg="red"></StylesLebel>
</div>
)
}
}

5.3 样式化组件

import styled from 'styled-components'

export default class StyleComponent extends Component {
render() {
const StylesChild = styles(Child)`
background: red
`
return (
<div>
<StylesChild></StylesChild>
</div>
)
}
} function Child(props) {
return <div className={props.className}>Child</div>
}

5.4 样式扩展

const MyButton = styled.button`
background: yellow;` const BigButton = styled(MButton)`
height: 100px;
width: 100px;`

React 组件之样式的更多相关文章

  1. react组件配置样式hover效果的实现

    需求 react 自定义一个组件,组件内部样式可以灵活配置 问题 一般样式都可以通过属性传入,比如:颜色,字号等,但是对于一些有hover效果的地方,属性传入后,按照平时css的使用方式不太容易实现 ...

  2. 【react 样式】给react组件指定style

    1.使用行内样式(优先级高) 自定义的react组件是没有style属性的,如果要给想给自定义react组件指定style,我的方法是用一个<div>包裹自定义组件,然后给div指定sty ...

  3. 初学React:组件的样式

    React中组件的样式有三种: <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  4. React组件(组件属性this.state和this.props,css样式修饰组件)

    目录: 1.创建组件的第一种方式 function2.将组件抽离为单独的jsx文件3.省略.jsx后缀, 配置webpack设置根目录4.创建组件的第二种方式--使用class关键字创建组件5.组件私 ...

  5. React组件

    React组件 组件是React中的基本单位,在每个组件里面又封装了程序逻辑,通过reader标出界面片段或者回传一段描述,组件再通过React.renderComponent将组件展示在浏览器中.每 ...

  6. React组件开发

    目录: 属性:props 内联样式 状态记忆 : state 生命周期 访问DOM 表单输入 承接快速入门篇:http://www.cnblogs.com/jasonnode/p/4444504.ht ...

  7. 如何优雅的设计 React 组件

    作者:晓冬 本文原创,转载请注明作者及出处 如今的 Web 前端已被 React.Vue 和 Angular 三分天下,一统江山十几年的 jQuery 显然已经很难满足现在的开发模式.那么,为什么大家 ...

  8. 如何优雅的设计React组件

    如何优雅的设计 React 组件 如今的 web 前端已被 React.Vue 和 Angular 三分天下,一统江山十几年的 jQuery 显然已经很难满足现在的开发模式.那么,为什么大家会觉得 j ...

  9. wn-cli 像React组件开发一样来开发微信小程序

    项目地址:wn-cli wn-cli wn-cli 像React组件开发一样来开发微信小程序 名字由来:wn -> weapp native 取第一个字母 Install npm install ...

  10. 编写React组件的最佳实践

    此文翻译自这里. 当我刚开始写React的时候,我看过很多写组件的方法.一百篇教程就有一百种写法.虽然React本身已经成熟了,但是如何使用它似乎还没有一个"正确"的方法.所以我( ...

随机推荐

  1. 【转帖】Linux 调优篇:虚拟化调优(hugepage 大页内存)* 叁

    一. 大页(HugePages)概念Hugepage的引入二. hugepages相关概念三.Regular Pages 与 HugePagesa.Regular Pagesb.Huge Pages四 ...

  2. OpenGauss3.1.0 单机版安装部署过程

    背景 由易到难 先进行单节点的设置 先说坑 openEuler2203 默认安装了python3.9 但是openGauss里面指代了3.6和3.7 /openGauss/install/om 注意在 ...

  3. CentOS firewall简单总结

    CentOS firewall简单总结 简介 防火墙是安全的重要道防线. 硬件防火墙一般部署再内网的边界区域.作为最外层的防护. 但是一般硬件的防火墙会比较宽松. 不然会导致很多业务不可用 软件防火墙 ...

  4. 当你对 redis 说你中意的女孩是 Mia

    作者:京东科技 周新智 一.Redis 众所周知,Redis = Remote Dictionary Server,即远程字典服务. 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久 ...

  5. gpedit.msc 打不开

    win10系统推出已有不短的时间了,朋友们也纷纷升级了win10系统,但是暴露的问题也是越来越多,比如win10系统打开运行输入gpedit.msc命令时却提示找不到文件.那出现win10打不开gpe ...

  6. golang uuid库介绍

    简介: 在现代软件开发中,全球唯一标识符(UUID)在许多场景中发挥着重要的作用.UUID是一种128位的唯一标识符,它能够保证在全球范围内不重复.在Go语言中,我们可以使用第三方库github.co ...

  7. SP5464 CT - Counting triangles 题解

    题目翻译 题意 有一个网格,左上角是 \((0,0)\),右上角是 \((x,y)\).求这个网格中一共有多少个等腰直角三角形. 输入 第一行给定一个 \(c\),表示有 \(c\) 组数据. 后面 ...

  8. python快速入门【五】---- 面向对象编程、python类

    python入门合集: python快速入门[一]-----基础语法 python快速入门[二]----常见的数据结构 python快速入门[三]-----For 循环.While 循环 python ...

  9. Web-background information

    Client and Server A connection on the Internet takes place between 2 computers only: one that has th ...

  10. 使用C语言构建一个独立栈协程和共享栈协程的任务调度系统

    使用了标准库头文件 <setjmp.h>中的 setjmp 和 longjmp两个函数,构建了一个简单的查询式协作多任务系统,支持独立栈和共享栈两种任务. 其中涉及到获取和设置栈的地址操作 ...