react学习总结 | 青训营笔记

64 阅读4分钟

这是我参与「第四届青训营」笔记创作活动的第9天

前言

react是一个基于单向数据流的响应式系统,它提供了快速开发UI界面的核心功能,它提供了组件化,可单元测试,高效,灵活的开发方式,造就了现在的庞大前端社区生态。react是由于脸书在使用php的时候引入xhp,启发了后来的react思想,react由FaxJS变种而来。

React响应式系统设计

  1. 监听事件
  2. 消息驱动
  3. 监控系统
  4. UI界面

react的响应式系统核心部分由一下步骤组成,首先事件驱动,触发回调函数,处理状态变更,更新UI视图。

响应式 VS 传统架构

  • 状态更新,UI自动更新(非响应式系统中状态更新了,还需要手动调用DOM更新视图,很麻烦)
  • 前端可以组件化,复用,封装(传统框架中,难以重复使用,代码层次欠缺隔离,无法组件化)
  • 状态之间互相依赖关系,只需要声明(传统架构中,UI之间数据依赖需要手动维护)

React 组件化

  • 组件是组件的组合,或者原子组件。
  • 组件内部拥有私有属性,外部不可见。
  • 父组件可传递状态给子组件。
  • React是单向数据流。
  • 组件由其它组件拼装而成。
  • 组件由state和props两种状态。
  • 组件声明了UI的映射和状态。

React 声明周期

挂载阶段

  • 先执行constructor方法,通常我们在这里初始化state。
  • 可选择getDerivedStateFromProps调用,当我们接收到新的props的时候想修改state去调用。
  • 接着会调用render方法,render是一个纯函数只返回需要渲染的东西。
  • 最后调用componentDidMount,我们可以在这里进行订阅,操作DOM等操作。

更新阶段

  • shouldComponentUpdate: shouldComponentUpdate(nextProps, nextState),有两个参数nextPropsnextState,表示新的属性和变化之后的state,返回一个布尔值,true表示会触发重新渲染,false表示不会触发重新渲染,默认返回true,我们通常利用此生命周期来优化React程序性能
  • render: 更新阶段也会触发此生命周期。
  • getSnapshotBeforeUpdate: getSnapshotBeforeUpdate(prevProps, prevState),这个方法在render之后,componentDidUpdate之前调用,有两个参数prevPropsprevState,表示之前的属性和之前的state,这个函数有一个返回值,会作为第三个参数传给componentDidUpdate,如果你不想要返回值,可以返回null,此生命周期必须与componentDidUpdate搭配使用
  • componentDidUpdate: componentDidUpdate(prevProps, prevState, snapshot),该方法在getSnapshotBeforeUpdate方法之后被调用,有三个参数prevPropsprevStatesnapshot,表示之前的props,之前的state,和snapshot。第三个参数是getSnapshotBeforeUpdate返回的,如果触发某些回调函数时需要用到 DOM 元素的状态,则将对比或计算的过程迁移至getSnapshotBeforeUpdate,然后在 componentDidUpdate中统一触发回调或更新状态。

卸载阶段

  • componentWillUnmount: 当组件被卸载或者销毁了就会调用,我们可以在这个函数里去清除一些定时器,取消网络请求,清理无效的DOM元素等垃圾清理工作。

React Hook

Hook,翻译过来就是钩子。Hook 是一些可以让你在函数组件里注入 React state 及生命周期等特性的函数。Hook 不能在 class 组件中使用。 这使得你不使用 class 也能使用 React。简化了React的编程方式。类似于Vue3的组合式API。

import React,{useState} from 'react';

function Example(){
  const [count,setCount] = useState(0);//Hook
  
  return (
   <div>
     <p>You CLick {count} times</p>
     <button onClick={()=>setCount(count+1)}</button>
   </div>
   )
}

VDOM

vdom是一种用于和真实DOM同步,存在JS内存中维护的一个对象,它具有DOM类似的树结构,并和DOM建立一一对应关系。它赋予了React声明式的API,只要我们修改UI的状态,React就确保DOM匹配该状态,这使得我们不需要手动去操作DOM。

React Diff算法

diff算法, 是 Virtual DOM 产生的一个概念, 用来计算出Virtual DOM中真正变化的部分,并只针对该部分进行原生DOM操作,而非重新渲染整个页面,从而提高了页面渲染效率。react的diff算法中,如果2个不同的类型元素则直接进行替换,如果是同类型DOM元素则更新,同类型组件元素则递归。理想状态达到了O(N)的算法复杂度。

总结

在React的学习中,学习了比较核心的东西例如Vdom和Vdom的diff算法,还有响应式模型,这些是光看书本很难学到的,至少现在心中有了一个大概的印象,在理解源码的时候就容易得多,并且在调用Hook的时候知道自己到底在做什么,会发生什么,一切好像都是可控的,这离不开基础课的扎实。