react 特性

react 介绍

2020年1月5日-react native总结

React的三大突出特点:组件化、虚拟DOM和单向数据流

React 组件

React中的组件化思想,可以理解为把具有独立功能的UI部分进行了封装。

组件化的优点:

  1. 可组合性:定义了一个UI组件后,可以和其他组件进行并列或者嵌套使用,多个小组件还可以构建一个复杂组件,一个复杂的组件也可以分解成多个功能简单的小组件。
  2. 可重用性:定义后的组件功能是相对独立的,在不同的UI场景中,可以重复使用。
  3. 可维护性:每个组件的实现逻辑都仅限于自身,不涉及其他组件,这样的可维护性较高。

组件的生命周期

  1. 挂载期:一个组件实例初次被创建的过程。
  2. 更新期:组件在创建后再次渲染的过程。
  3. 卸载期:组件在使用完后被销毁的过程。
image.png

挂载期

挂载期有一些方法会被依次触发,列举如下:

  • constructor(构造函数,初始化状态值)
  • getInitialState(设置状态机)
  • getDefaultProps(获取默认的props)
  • componentWillMount(首次渲染前执行)
  • render(渲染组件)
  • componentDIdMount(render渲染后执行的操作)

组件更新

组件更新指的是在组件初次渲染后,进行了组件状态的改变。在实际项目中,组件更新是经常性操作。React在生命周期中的更新过程包括以下几个方法:

  1. componentWillReceiveProps:当父组件更新子组件的state时,该方法会被调用。
  2. shouldComponentUpdate:该方法决定组件state或者props的改变是否需要重新渲染组件。
  3. componentWillUpdate:在组件接受新的props或者state时,即将进行重新渲染前调用该方 法,和componentWillMount方法类似。
  4. componentDidUpdate:在组件重新渲染后调用该方法,和componentDidMount方法类似。

卸载期

生命周期的最后一个过程为组件卸载期,也称为组件销毁期。该过程主要涉及一个方法,即 componentWillUnmount,当组件从DOM树删除的时候调用该方法。

image.png

虚拟DOM

Document Object Model(DOM,文档对象模型)是W3C(World Wide Web Consortium,万维网联盟)的标准,定义了访问HTML和XML文档的标准方法:W3C文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。简单来说,就是用于连接document和JavaScript的桥梁。

Web界面实质上是构建的一棵DOM树,当某一节点发生变化时,React会对当前的DOM树和前一状态的DOM树进行比较,这个比较的算法就是本节讲述的dom-diff算法。

前端渲染UI就离不开DOM操作,然而经常性地操作DOM难免会导致项目性能变差。React在这方面做了优化工作,提供了虚拟DOM。要更新数据就先更新虚拟DOM(虚拟DOM是内存数据,所以 操作速度极快),再进行dom-diff操作,把最后真正发生变化的数据渲染到真实DOM中,整个过程大大减少了真实DOM操作,同时也大大提高了页面性能。

React在标准dom-diff算法上进行了优化,让时间复杂度从O(n3)减少到了O(n),这样UI的渲染性能就得到了极大提升。
提升的方法

  1. React认为相同类型的两个组件有类似的DOM树结构,在这种情况下会采用diff算法比较两个DOM树的差异。如果两个组件的类型不同,那么React会认为这两个DOM树结构不同,将之 前的组件直接删除,然后创建新组件。
  2. 同一层次的一组节点,可以通过唯一的key值来进行区分。

单向数据流

在React中,数据流是单向的。
数据的流向是从父组件流向子组件,至上而下。这样能让组件之间的关系变得简单且可预测。

props和state是React组件中两个非常重要的概念。props是外来的数据,state是组件内部的数据。一个组件内,可以接受父组件传递给它的数据,如果props改变了,React会递归地向下遍历整棵组件树,在使用到这个属性的组件中重新渲染;同时组件本身还有属于自己的内部数据,只能在组件内部修改。可以将其与面向对象编程进行类比:this.props就是传递给构造函数的参数,this.state就是私有属性。

单向数据流的好处就是,所有状态变化都是可以被记录和跟踪的,源头容易追溯,没有“暗箱操作”,只有唯一入口和出口,使程序更直观易理解,利于维护。

组件的状态和属性

state和props是React中的两种数据方式,无论是state数据还是props数据只要发生数据改变,就会重新渲染组件。

state

state为状态之意。组件在React中可以理解为是一个状态机,组件的状态就是用state来记录的。相对props来说,state是用在组件内部并且是可以修改的。
React组件可以理解为一个状态机。组件的更新其实就是内部state值的更新,state属性记录着组件的状态,在实际项目中会经常性地对组件进行重新渲染,这就离不开重新设置state属性。

props

props是properties的简称,范围为属性。在React中的组件都是相对独立的,一个组件可以定义接收外界的props,在某种意义上就可以理解为组件定义了一个对外的接口。

最后代码回顾一下

//简单组件示例 hello.jsx
import React, { Component } from 'react';
import { render } from 'react-dom';
export default Class hellloComponent extends React.Component {
  render() {
    return (
     <div>
       Hello {this.props.name}.
     </div>
    )
  }
}

//简单组件示例 index.jsx
import React, { Component } from 'react';
import { render } from 'react-dom';
import MyComponent from './myComponent'
export default class extends React.Component {
  render() {
    return (
 <hellloComponent   name="world"/>                      // name 是自定义组件的属性 
    )
  }
}

深入react原理

JSX

JSX(JavaScript XML),是JavaScript的一种拓展语法。可以在JavaScript代码中编写更像XML写法的代码。React官方推荐使用JSX替代常规JavaScript写法,从而让代码更直观,达到更高的可读性。但需要注意的一点是,它不能直接在浏览器中执行,需要经过转换器将JSX语法转为JS之后才可以。

class HelloMessage extends React.Component {
  render() {
    return (
      <div>
        <div>
          <div>Hello React</div>
        </div>
      </div>
    );
  }
}
ReactDOM.render(
  <HelloMessage />,
  mountNode
);

Babel

Babel原名是6to5,是一个开源的转译工具。它的作用就是把当前项目中使用的ES 6、ES 7和JSX等语法,转译为当下可以执行的JavaScript版本,让浏览器能够识别。简单来说,它是一个转码工具集,包含各种各样的插件。

React事件系统

React事件系统在原生的DOM事件体系上做了一些优化,封装了一个“合成事件”层,事件处理程序通过合成事件进行实例传递。在React的事件系统中,没有把所有事件绑定到对应的真 实DOM上,而是使用委托机制实现了一个统一的事件监听器,把所有的事件绑定到了最外层document上,然后再将事件进行分发。这样极大地减少了内存开销,使运行性能得到极大提升。

在合成事件中,React提供了三种绑定事件的方法:
1. 组件上绑定 2. 在构造函数中绑定 3. 箭头 函数绑定

参考书目

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