响应式系统与React | 青训营笔记

89 阅读6分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天

R-C.jfif

课程笔记

React的历史与应用

React是一个前端响应式框架。

React发展历史

  • 2010年 Facebook在其php生态中,引入了xhp框架,首次引入了组合式组件的思想,启发了后来的React设计。
  • 2011年 Jordan Walke创造了FaxJS,也就是后来的React原型。
  • 2012年 在Facebook收购Instagram后,该FaxJS项目在内部得到使用,Jordan Walke基于FaxJS的经验,创造了React。
  • 2013年 React正式开源,在2013 JSConf上Jordan Walke介绍了这款全新的框架。
  • 2014年-今天 生态大爆发,各种围绕React的新工具/新框架开始涌现。

React的应用领域

  • 前端应用开发,如Facebook,Instagram,Netflix网页版。

image.png

  • 移动原生应用开发,如Instagram,Discord,Oculus。

image.png

  • 结合Electron,进行桌面开发。

image.png

React的设计思路

只有当我们认真的了解了React当初是为了解决哪些问题而出现的,在今后的React的学习与使用中才能更好的理解其用法和原理,就不会导致今后会很容易忘记。

UI编程痛点

如下这个苹果官网的购物UI界面

image.png

当我们想在选取颜色和型号时,右上角的手机价格也应随着我们所选择的不同配置来进行改变,如果使用传统的原生JS来编写这个功能,我们需要给很多的元素绑定点击事件,并使用callback来实现,这样就会陷入回到地狱,使得代码管理起来很麻烦。

总的来说原生的JS编写UI时有以下这些痛点:

  • 状态更新,UI不会自动更新,需要手动调用DOM进行更新。
  • 欠缺基本的代码层面的封装和隔离,代码层面没有组件化。
  • UI之间的数据依赖关系,需要手动维护,如果依赖链路过长,则会遇到“Callback Hell”(回调地狱)。

转换式与响应式

  • 转换式系统

    大致模型为给定输入求解输出

    常见的转换式系统为各类编译器,数值计算可以看做是一种简单的转换式系统

  • 响应式系统

    大致模型为监听事件消息驱动

    常见的响应式系统为监控系统和UI界面

image.png

当响应式系统应用于前端UI上时

image.png

以上四个过程就是我们在写前端UI时所需要实现的四个行为。

相比于原生JS编写前端UI时存在的问题,React对应的解决了这些问题

  • 状态更新,UI自动更新。
  • 前端代码组件化,可复用,可封装。
  • 状态之间的互相依赖关系,只需声明即可。

组件化

简单来说,组件化就是将页面的整体布局分为一个一个的组件,按照“组件树”的形式来在页面中呈现出来。

image.png

组件化的准则

  • 组件是组件的组合或者原子组件。

    在上图“组件树”中Root组件就是由内容组件和顶栏组件组合而成的。

  • 组件内部拥有自己的状态,外部不可见。

  • 父组件可以将状态传入组件的内部

组件的状态归属问题

如上图的UI界面中的当前价格的状态应该属于谁呢?

当前价格只能属于Root节点!

Root节点作为根结点,只有将该状态放在Root节点,才能让后边的内容和顶栏两个子组件共享这个状态(即组件化准则中的第三条)。(但并不是指所有的共享状态都应放到Root节点,只是该例子恰好如此)

状态归属的基本原则:状态归属于两个节点向上寻找到最近的祖宗节点。(状态上升)

React状态管理库就能帮我们很好地解决这个状态归属问题。

React是单向数据流,还是双向数据流?

React是单向流,因为在React中只能是父组件给子组件传送东西,而不能子组件向父组件传东西,子组件一般通过父组件提供的函数来修改父组件提供的状态。

如何解决状态不合理上升的问题?

使用React状态管理库来进行解决。

组件设计

组件设计经验

  • 组件声明了状态和UI的映射。

    映射可以看成是函数

  • 组件有Props/State两种状态。

    State表示组件内部的状态,Props表示由组件外部传入的状态。

  • “组件”可由其他组件拼装而成。

组件代码的样子

  • 组件内部拥有私有状态State。
  • 组件接收外部的Props状态提供复用性。
  • 根据当前的Props/State返回一个UI。

image.png

React(hooks)的写法与React实现

Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React特性。

Hooks写法的代码类似下图

image.png

在React中声明一个组件的新状态需要手动的去调用useState这个函数,该函数传入一个状态的初始值,返回值为一个数组,该数组的第一个函数为状态本身,第二个函数是这个状态的seter。上图代码实现了一个简单的点击按钮更新UI的功能。

image.png

这个部分的代码多了一个useEffect函数,该函数用于解决组件的副作用。

React的实现

JSX不符合JS语法标准怎么办?

将JSX转译(将一个语言的语法转换为另一个语言的语法)为JS语法标准,如下图所示

image.png

可以使用Babel来实现上述功能。

返回的JSX发生改变时,如何更新DOM?

JSX的返回值是一个类似DOM片段的东西但其实它不是DOM,其称为虚拟DOM(Virtual DOM)。

Virtual DOM是一种用于和真实DOM同步,而在JS内存中维护的一个对象,它具有和DOM类似的树状结构,并和DOM可以建立一一对应关系。

它赋予了React声明式API:您告诉React希望UI是什么状态,React就确保DOM匹配该状态。这使您可以从属性操作、事件处理和手动DOM更新这些在构建应用程序时必要的操作中解放出来。

(真实的DOM不是JS中的对象而是浏览器内部维护的一个状态,我们只能通过DOM接口修改DOM)

image.png

React状态管理库

核心思想

image.png

即将状态抽离到UI外部进行统一管理。

劣势:降低组件的复用性。

状态管理库推荐:

image.png

状态机

image.png

当前状态,收到外部事件,迁移到下一个状态。

Modern.js/Reduck

image.png

应用级框架科普

image.png

image.png

image.png

总结

通过本次课程大致对React框架有了一定的了解,刚入门React还有很多不明白和不理解的地方,还需要后边多加学习才行。