React 笔记 | 青训营笔记

50 阅读2分钟

React 特性与简介

声明式(对比命令式)

组件化 (组件拥有状态)

跨平台编写(渲染器跨平台)

React 哲学

等待资源加载时间和大部分情况下浏览器单线程执行是影响 web 性能的两大主要原因。

image-20230505130203888

Suspense:弱网环境显示 fallback

ErrorBoundary:本质上是一个高阶组件,当 hasError 为 true 的时候渲染降级 UI

 // 实现 ErrorBoundary
 // 1. 用 componentDidCatch 捕获错误
 // 2. 用 getDerivedStateFromError 更新 state,使得下一次 render 时能够渲染出备用 UI
 // 3. 用 props.children 渲染出备用 UI
 // 4. 用 props.fallback 渲染出备用 UI
 ​
 class ErrorBoundary extends React.Component {
   state = {
     hasErrorfalse,
     errornull,
  };
 ​
   static getDerivedStateFromError(error) {
     return {
       hasErrortrue,
       error,
    };
  }
 ​
   componentDidCatch(error, errorInfo) {
     console.log(error, errorInfo);
  }
 ​
   render() {
     const { hasError, error } = this.state;
     const { fallback, children } = this.props;
     if (hasError) {
       return fallback ? fallback(error) : <div>出错了</div>;
    }
     return children;
  }
 }

js 加载会阻塞 dom 更新(时间切片-React fiber)

更新流程

  1. Scheduler(调度器)

    • 维护时间切片(在浏览器空闲时间执行操作)
    • 与浏览器任务调度
    • 优先级调度
  2. Reconciler (协调器)

    • jsx 转为 fiber

    • fiber 树对比(双缓存)

      image-20230505131320777

    • 确定本次更新的 fiber

  3. Renderer (渲染器)

    • 渲染器用于管理一棵 React 树
    • 使其根据底层平台进行不同的调用

image-20230505131144651

组件

类组件

继承基类+构造函数

this

生命周期

render 方法

函数式组件

没有生命周期

借助 Hook(16.8)

return JSX

image-20230505132158421

Hook

  • 只能在最顶层(按执行顺序判读)

  • 只能在函数里用 hook

    image-20230505132525881

www.javashuo.com/article/p-y…

要注意过期闭包的陷阱

如上例所示,const log = inc( ) 相当于执行了一次 inc 此时 value 为 1,之后再执行 log()value 也是过期的值了……

image-20230505194847103

父组件给子组件通信

为了避免逐层传递,可以使用一个 wrapper 进行包裹,React.cloneElement(child, commonProps) 实现对子组件的传递

子组件给父组件通信

通过父给子传递一个介质

组件间通信

context & reducer

image-20230505210517836

image-20230505211018485