react-32-样式隔离-引入css方式-vue对比

1.前言

样式污染是开发常遇到的问题
解决办法其实就是让class名不重复,针对这个不重复有很多方法

1.1 class命名不重复:工具实现命名唯一
1.2 CSS Modules模块化
1.3 Styled-component


在之前文章代码基础上进行修改react-路由传参


2. 问题表现

比如城市界面 设置一个 h1 标签字体红色

2.1 index.css

h1{
     color: red;
}

2.2 城市组件引用 样式文件

需要通过 import 导入

import React, { Component } from 'react'
import { Link } from "react-router-dom";
import "./index.css"

2.3 效果

2.gif

每个界面的 h1标签都变红色了


3. sass 安装

后续的写法准备用sass,所以先安装下
注意版本问题 我是装的"sass": "^1.36.0"

npm i sass -D

Tips

安装sass node-sass的时候千万注意自己npm版本问题
如果报了很多恶心的错误,非常难解决,还是老老实实降低自己的npm版本吧

或者装多个版本的npm ,但切换使用


4.react脚手架自带模块化 .module.css 解决方案

4.1 原理

css文件作为一个模块引入,这个模块中的所有css,只作用于当前组件。不会影响当前组件的后代组件


4.2 步骤

1.把样式文件改为xx.module.css就行 用less或者sass也一样
我这里使用 sass来演示
将原来的 index.css 改为index.module.scss文件

  1. 一般只用class来写样式
.testColor{
   color: red;
}
.test-bg{
  background-color: orange;
}

注意 sass的样式 后缀是scss


4.3 引用样式文件

import styles from "./index.module.scss"
console.log("样式对象:",styles)

4.4 样式书写

  1. 命名的样式名注意用法 ,这个- 横杠的写法在js里面不合法所以用["a-b"]的形式使用
 render() {
        return (
            <div className={styles.testColor}>
                <h1 className={styles["test-bg"]}>城市列表</h1>
            </div>
        )
    }

4.5 多个类样式的写法

 <p className={`${styles.testColor} ${styles["test-bg"]}`}> 多个类样式</p>

4.6 效果

1.png

回顾我们前言 的内容 ,其实 这些工具,都是帮我们起个不会重复的名字,来保证不会样式污染

4.7 缺点

1.引用的类名,不能使用连接符(.xxx-xx),在JavaScript中是不识别的
2.所有的 className都必须使用 {style.className} 的形式来编写
3.不方便动态来修改某些样式,依然需要使用内联样式的方式;



5.编写css的规则

1.可以编写局部css,不会随意污染其他组件内的原生;
2.可以编写动态的css,可以获取当前组件的一些状态,根据状态的
变化生成不同的css样式;
3.支持所有的css特性:伪类、动画、媒体查询等;
4.编写起来简洁方便、最好符合一贯的css风格特点


6. 对比vue中使用css的方式

6.1 vue

1.通过style标签编写样式
2.scoped属性进行样式隔离
3.lang属性设置预处理器
4.内联样式风格的方式来根据最新状态设置和改变css


6.2 react

1.在组件内直接使用
2.组件中引入 .css文件
3.组件中引入 .module.css文件
4.CSS in JS

下面分别对这几种方式进行分析
其中 引入 cssmodule.css文件上面已经讲过


7. react组件内直接使用

直接在组件中书写css样式,通过style属性直接引入

7.1 样式编写

import React, { Component } from "react";

const card ={
    color: "#303133",
    backgroundColor: "#fff",
    border:"1px solid #DCDFE6",
    borderRadius:"5px",
    width:"182px",
    padding:"10px",
    margin:"0 auto",
    boxShadow:"0 2px 12px 0 rgb(0 0 0 / 10%)"
}

7.2 样式使用

export default class MyComponent extends Component {
    render() {
        console.log("我的界面:",this.props)
        return (
            <div>
                <h1>关于我的传说</h1>
                <p style={card}>
                    天行健,君子以自强不息;地势坤,君子以厚德载物;
                </p>
            </div>
        )
    }
}

7.3 style 直接绑定

       <p style={{background:"red",color:"#FFF"}}>样式对象变量</p>

7.4 效果

1.png

7.5 总结

注意
css属性需要转换成驼峰写法

这种方式优点

1.内联样式, 样式之间不会有冲突
2.可以动态获取当前state中的状态

缺点

1.写法上都需要使用驼峰标识
2.某些样式没有提示

3.大量的样式, 代码混乱
4.某些样式无法编写(比如伪类/伪元素)


8.组件中引入css文件

单独写个css ,然后组件中引入,刚开始学css分离的时候就这样哈哈
test.css

.title {
  color: orange;
  font-size: 66px;
}

组件引入

import React, { PureComponent } from 'react';

import './test.css';

export default class App extends PureComponent {
  render() {
    return (
      <div className="app">
        <h2 className="title">单独的css文件</h2>
       
      </div>
    )
  }
}

PureComponent这里作为一个引子


9.CSS in JS

CSS-in-JS, 是指一种模式,其中CSSJavaScript生成而不是在外部文件中定义
需要注意的是, 这个功能需要安装第三方库,常用的如下
1.styled-components
2.emotion
3.glamorous


10.styled-components的基本使用

本质是通过函数的调用,最终创建出一个组件:
1.这个组件会被自动添加上一个不重复的class
2.styled-components会给该class添加相关的样式

安装

 npm install --save styled-components

简易用法

创建了一个Box样式组件,组件渲染之后是一个div标签
Box组件跟使用react的组件一样,只不过现在他们有了自己的样式

  const Box= styled.div`
    color: blue;
  `;

  render(
    <Box>
        Hello  styled-components!
    </Box>
  );

类名

  const Box = styled.div`
    color: red;

    h3 {
    color: yellow
    }

    .o2{
    color: orange
    }
  `

  render(
    <Box>
      <p>红色 p 标签 </p>
      <h3>黄色 h3 标签</h3> 
      <p className="o2" >橘色 p 标签</p>
    </Box>
  )

11. 组件使用


style.js

首字母必须大写

export const Mytitle= styled.div`
  height: 66px;
  border: 1px solid greenyellow;
  color: orange;
`;


引入

import React, { Component } from "react";

import { Mytitle } from "./style";

class TestStyle extends Component {
  constructor(props, context) {
    super(props);
  }  
 
  render() {
    return (
     <div>
       <Mytitle title="有幸生在华夏">建党100年</Mytitle>
     </div>
    );
  }
}

export default TestStyle;

参考资料

网络各路大神


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容