React: 认识React

关于React的基本概念

Posted by chanweiyan on July 11, 2020

React 是什么?

  • React是一个用来构建用户界面的库,它最初是由Facebook的工程师创建的。
  • React提供了一套基于组件的简单、灵活的API。
  • 组件是React的基本单元,在React应用中被广泛使用。
  • React在程序和浏览器DOM之间实现了一个虚拟DOM层。
  • 虚拟DOM使用快速比对算法对DOM进行高效更新。
  • 虚拟DOM具有优秀的性能,但最大的好处是它提供的思维模型。

React应用的主要“成分”的概览

React应用的主要“成分”的概览

ReactDOM.render 的函数签名

1
2
3
4
5
ReactDOM.render(
  ReactElement element,
  DOMElement container,
  [function callback] // 中括号 [] 表示参数可选,非必填
) -> ReactComponent

React.createElement 的函数签名

1
2
3
4
5
6
7
// 中括号 [] 表示参数可选,非必填

React.createElement(
  String/ReactClass type, // 我在创建什么?
  [object props],         // 我怎么配置它?
  [children...]           // 它包含什么?
) -> React Element

概念

一种可用的熟悉的思维结构:一种与常规DOM元素相似的元素的树形结构。 React 元素是DOM 元素的虚拟表示。

  • React元素与DOM元素之间的一些相似之处

React元素与DOM元素之间的一些相似之处

  • React元素在React应用的整个过程中被使用的情况

React创建和管理元素的简单蓝图

React使用React元素来创建虚拟DOM,React DOM管理和使用虚拟DOM来协调和更新实际DOM。

  • React会递归地对一系列React元素进行求值来确定它应该如何为组件形成虚拟DOM树
1
2
3
4
5
6
7
8
const root = React.createElement('div', {},
  React.createElement('div', {}, 'Hello, world!',
    React.createElement('a', {href: 'mailto:mark@ifelse.io'},
      React.createElement('h1', {}, 'React In Action'),
      React.createElement('em', {}, '...and now it really is!')
    )
  )
);

为组件形成虚拟DOM树

可以沿箭头向下而后向右来了解React对嵌套React元素求值的方式以及每个参数在问什么

DOMElement

DOMElement

  • React 元素
1
2
3
4
5
React元素接收一个字符串来创建一种DOM元素(div、a、p等)。
可以通过props对象为React元素提供配置。这类似于DOM元素的属性(如<img src="aUrl"/>)。
React元素是可嵌套的,可以将其他React元素作为某个元素的子元素。
React使用React元素创建虚拟DOM。当React更新浏览器DOM时,React DOM会使用虚拟DOM。
React元素是React中构成组件的东西。
  • React类有支撑实例而React元素没有

React类有支撑实例而React元素没有

React会为React类的实例(不是蓝图本身)创建并追踪一个特殊的数据对象

React元素是DOM的镜像而组件是将它们组织在一起的方法

支撑实例是一种为特定组件提供数据存储和访问的方法

  • React的工作方式的整体情况

React的工作方式的整体情况

React使用React类和React元素创建内存中控制实际DOM的虚拟DOM。

它还创建了一个“综合”事件系统,以便仍可以对来自浏览器的事件做出反应(如点击、滚动和其他用户引起的事件)

  • 状态是什么?

从另一个方面来看,状态是某个特定时间事物的信息。例如,通过询问“你今天怎么样?”来了解朋友的“状态”。

1
2
this.state // 可变状态
this.props // 不可变状态
  • 应该在什么时候使用状态?

在想要改变存储在组件中的数据时使用。

在React中,需要变化的数据常常来自于用户输入(通常是文本、文件、切换选项等)或者是用户输入的结果,但也可能是许多其他东西。

  • this.setState
1
2
3
4
5
// this.setState接收一个用来更新状态的更新器函数,而且this.setState不返回任何东西
setState(
  function(prevState, props) -> nextState,
  callback
) -> void

不能像在非React情况下那样直接覆盖this.state,因为React需要追踪状态并确保虚拟DOM和实际DOM保持同步。

  • 什么会引起React进行更新?

React实现了一个合成事件系统作为虚拟DOM的一部分,它会将浏览器中的事件转换为React应用的事件。

React要确保DOM与虚拟DOM保持一致,如果虚拟DOM没有更新,就不会让DOM发生变化。

  • 用单向数据流创建新组件

用单向数据流创建新组件

要添加帖子,需要从输入字段获取数据并以某种方式传给父组件,然后更新后的数据将被用来渲染帖子

  • JSX是什么?

它是对ECMAScript的一种类XML的语法扩展,但它没有定义任何语义,其专门提供给预处理器使用。

JSX是JavaScript的扩展,其类似XML并且仅用于代码转换工具。

  • 声明周期方法

React会在渲染和更新过程中按一定顺序调用它们。

  • 组件间通信
1
2
3
React组件通过属性进行通信并具有父子关系。
父组件能够传递数据给子组件,但子组件不能修改父组件。
它们可以通过回调函数将数据传递给父组件,但不能直接访问父组件。

参考

  • 《React实战》
  • 《React In Action》