首页 > 其他分享 >React 组件之样式

React 组件之样式

时间:2023-11-23 17:58:27浏览次数:31  
标签:Less color React 样式 css styled 组件 CSS

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

我们从前面的学习知道一个 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;`

标签:Less,color,React,样式,css,styled,组件,CSS
From: https://www.cnblogs.com/hubert-style/p/17852134.html

相关文章

  • react开发 jest写单元测试 如何借助mock模拟实现接口返回文件流的下载测试
    要借助mock模拟实现接口返回文件流的下载测试,可以使用以下步骤:1.创建一个用于接收文件流的虚拟DOM元素,例如通过`document.createElement('a')`创建一个`<a>`元素。2.使用`URL.createObjectURL()`方法将文件流转换为URL。3.设置创建的虚拟DOM元素的`href`属性为URL,同时设置`dow......
  • react antd 表格固定高度
    <divclassName="ad-body"><TableclassName="area-drawing-table"rowClassName={(record,index)=>index===selectIndex?'ant-table-row-selected':''}rowKey={record=>recor......
  • Vue + Element UI 实现复制当前行数据功能(复制到新增页面组件值不能更新等问题解决)
    1、需求使用Vue+ElementUI实现在列表的操作栏新增一个复制按钮,复制当前行的数据可以打开新增弹窗后亦可以跳转到新增页面,本文实现为跳转到新增页面。2、实现1)列表页index.vue<el-table><!--其他列--><el-table-columnlabel="操作"width="150"><templateslot-s......
  • 18、Scaffold 布局组件
    Scaffold 是一个非常重要的布局组件,它提供了一个常见的应用程序结构布局,包含了许多基础的UI元素和交互方式。Scaffold 组件主要由以下几个部分组成:AppBar:用于显示在页面顶部的应用栏,通常包含标题、导航按钮、操作按钮等。body:包含了页面主要内容的部分,可以是任意的Widge......
  • Vue + Element UI 实现复制当前行数据功能(复制到新增页面组件值不能更新等问题解决)
    1、需求使用Vue+ElementUI实现在列表的操作栏新增一个复制按钮,复制当前行的数据可以打开新增弹窗后亦可以跳转到新增页面,本文实现为跳转到新增页面。2、实现1)列表页index.vue<el-table><!--其他列--><el-table-columnlabel="操作"width="150"><templateslot-scope=......
  • 界面组件Telerik UI for WinForms中文教程 - 创建明暗模式的桌面应用
    黑暗模式现在在很多应用程序中都挺常见的,但如何在桌面应用程序中实现它呢?这很简单,本文将为大家介绍如何使用一个类和命令行调用来实现!TelerikUIforWinForms拥有适用WindowsForms的110多个令人惊叹的UI控件。所有的UIforWinForms控件都具有完整的主题支持,可以轻松地帮助开发......
  • 无涯教程-Tk - 基本组件
    基本窗口小部件是几乎所有Tk应用程序中可用的常见窗口小部件。可用的基本小部件列表如下:Sr.No.Widgets&Remark1Label用于显示单行文本的小部件。2Button可单击并触发动作的小部件。3Entry小部件过去接受单行文本作为输入。4Message用于显示多行文本的小部件......
  • VUE组件使用
    vue组件使用分三步: 1.引用组件importfacePopfrom'./components/facePop'2.注册组件components={facePop}3.使用组件<facePop></facePop>新建一个components文件夹存放组件src/components/facePop.vue<template><div><h2>我是一个facePop组......
  • 视觉差缓动效果的轮播--React版
    React实现视觉差效果缓动轮播效果如下(图片帧率低看起来有点卡顿,看个大概就行):分享一下思路:1.正常引入一个轮播组件(站在巨人肩膀省时省力),去除指示点、引导箭头等不需要的元素,有些组件支持配置,不支持就手动覆盖CSS样式了2.找到组件中用于显示展示当前图片的类名3.添加transform......
  • 界面组件DevExpress Reporting v23.1 - Web报表设计器功能升级
    DevExpressReporting是.NETFramework下功能完善的报表平台,它附带了易于使用的VisualStudio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表界面组件DevExpressReportingv23.1已经发布一段时间了,新版本增强了Web报表设计器的自定义......