Day11. React写样式

先补充两个东西

fragments的使用

  • 代替最外层包裹的div, jsx里面只能有一个东西, 不然报错
  • 可以用另一个东西替换掉, 就像小程序里面提供一个block, React提供好了, 帮助不显示不需要的<div>
// 最基本的使用
<Fragment>
  <h2>当前计数: 2</h2>
</Fragment>

// 还有一种写法 => 短语法
<>
  <h2>当前计数: 2</h2>
</>

// 有些情况不能写成短语法
// 给列表添加一个唯一的key, diff算法优化, 短语法的写法不能添加属性, 只能用Fragment
短语法不能添加属性.png

StrictMode, 严格模式

  • 重零开始创建一个项目, 默认会有
  • StrictMode是一个用来突出显示应用程序中潜在问题的工具:
    • 与Fragment一样, StrictMode不会渲染任何可见的UI;
    • 它为其后代元素触发额外的检查和警告;
    • 仅在开发模式下运行, 不会影响生产构建
  • 可以为应用程序的任何部分启用严格模式:


    部分启用.png

严格模式检查的是什么?

  1. 识别不安全的生命周期, 如componentWillMount
    不使用严格模式也会报这样的警告.png
  2. 使用过时的ref API
  • ref字符串的形式已经不推荐使用了


    image.png
  1. 检查以外的副作用
    • 这个组件的constructor会被调用两次;
    • 这是严格模式下故意进行的操作, 让你来查看在这里写的一些逻辑代码被调用多次是, 是否会产生一些副作用;
    • 在生产环境中, 是不会被调用两次的;
  1. 使用废弃的findDOMNode方法
    • 在之前的React API中, 可以通过findDOMNode来获取DOM, 不过已经不推荐使用了
  1. 检测过时的context API
    • 早期的Context是通过static属性生命Context对象属性, 通过getChildContext返回Context返回Context对象等方式来使用Context的;
    • 目前这种方式已经不推荐使用, 严格模式可以帮助检查出来.

React中的样式

组件化天下的CSS

  • 整个前端已经是组件化的天下:
    • 而CSS(层叠样式表)的设计就不是为组件化而生的, 所以在目前组件化的框架中都在需要一种合适的CSS解决方案.


      层叠样式表.png
  • 在组件化中选择合适的CSS解决方案应该符合以下条件:
    • 可以编写局部CSS: CSS具备自己的局部作用域, 不会随意污染其他组件内的原生;
    • 可以编写动态的CSS: 可以获取当前组件的一些状态, 根据状态的变化生成不同的CSS样式;
    • 支持所有的CSS特性: 伪类、动画、媒体查询等;
    • 编写起来简洁方便、最好符合一贯的CSS风格特点;

React中的CSS

  • 事实上, CSS一直是React的通电, 也是被很多开发者吐槽诟病的一个点.
  • 在这一点上, Vue做的确实要好于React
    • Vue通过在.vue文件中编写<style></style>标签来编写自己的样式;
    • 通过是否添加scoped属性来决定编写的样式是全局有效还是局部有效;
    • 通过lang属性来设置你喜欢的less、sass等预处理器;
    • 通过内联样式风格的方式来根据最新状态设置和改变CSS;


      Vue的解决方案.png
  • Vue在CSS上虽然不能称之为完美, 但使已经足够简洁自然方便了, 至少统一的样式风格不会出现多个开发人员, 多个项目采用不一样的样式风格.


    React.png

内联样式

  • 内联样式是官方推荐的一种CSS样式的写法:
    • style接受一个采用小驼峰命名属性的JavaScript对象, 而不是CSS字符串;
    • 并且可以引用state中的状态来设置相关的样式;


      image.png
  • 内联样式的优点:
    • 内联样式, 样式之间不会有冲突
    • 可以动态获取当前state中的状态
  • 内联样式的缺点:
    • 写法上都需要使用驼峰标识
    • 某些样式没有提示
    • 大量的样式, 代码混乱
    • 没写样式无法编写(比如伪类/伪元素)
  • 所以官方依然是希望内联样式和普通的CSS来结合编写;

普通的CSS

image.png
  • CSS导入了才会生效, 样式层叠, 权重高的覆盖权重低的
文件夹整理.png
样式层叠.png

css modules

  • css modules并不是React特有的解决方案, 而是所有使用了类似于webpack配置的环境下都可以使用.
    • 但使, 如果在其他项目中使用, 我们需要自己来进行配置, 比如配置webpack.config.js中的modules: true等.
  • React的脚手架已经内置了css modules的配置:


    image.png
  • css modules确实解决了局部作用于的问题, 也是很多人喜欢在React中使用的一种方案.
  • 但使这种方案也有自己的缺陷:
    • 引用的类名, 不能使用连接符(.home-title), 在JavaScript中是不识别的;
    • 所有的className都必须使用{style.className}的形式来编写;
    • 不方便动态的去修改某些样式
image.png
唯一性.png
依然需要配合内联样式.png

认识CSS in JS

  • 实际上, 官方文档也有提到过CSS in JS的方案:
    • 是指一种模式, 其中CSS由JavaScript生成而不是在外部文件中定义;
image.png
  • 在传统的前端开发中, 我们通常会将结构(HTML)、样式(CSS)、逻辑(JavaScript)进行分离.
    • 但是React的思想中认为逻辑本身和UI是无法分离的, 所以才会有了JSX的语法.
    • 样式也是属于UI的一部分
    • 事实上CSS-in-JS的模式就是一种将样式(CSS)也写入到JavaScript中的方式, 并且可以方便的使用JavaScript的状态;
    • 所以React也被人称之为All in JS
  • 当然, 这种开发的方式也受到了很多的批评:


    image.png

认识styled-components

  • 批评声音虽然有, 但是在我们看来很多优秀的CSS-in-JS的库依然非常强大、方便:


    image.png
  • 目前比较流行的CSS-in-JS的库有哪些呢?
    • styled-components
    • emotion
    • glamorous
  • 目前可以说styled-components依然是社区最流行的CSS-in-JS库
  • yarn安装 yarn add styled-components

补充: 模板字符串

<script>
  // 1. 模板字符串的基本使用
  const name = "why";
  const age = 33;
  const message = `my name is ${name}`;

  // 2. 标签模板字符串: 可以通过模板字符串的方式对一个函数进行调用
  funciton test(...args) {
    console.log(args);
  }
  
  test("aaa", "ccc");

  test`aaaa`;
  test`my name is ${name}, age is ${age}`

  test`
    font-size: 15px;
    color: ${props => props.color};
  `

</script>
image.png

styled-components的使用

h2设置过样式*1.5.png
  • 考虑到跟别人的冲突概率大不大

  • 真实开发中建一个文件夹, 导出

  • props穿透

  • attrs的使用

  • 传入state作为props属性


    动态的设置css样式.png
  • 两个比较高级的特性

    1. 继承, 有一些样式可能是一样的, 可以使用继承, 看业务需求


      继承.png
    1. 提供主题


      主题统一修改.png

coderwhy的React核心技术与开发实战课程链接

少年~来做同学呀~.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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