React 基础与实践 | 青训营笔记

70 阅读3分钟

React的特点

  • 声明式编程
  • 组件化:拆分成多个组件
  • 跨平台编写

用JavaScript构建快速响应和大型WEB应用程序的首选方式之一

影响Web性能的两大主要原因:

等待资源加载:一次性请求太多资源、网络请求慢、资源加载失败

  • 解决方法:React.Lazy、React.Suspense、ErrorBoundary 浏览器线程执行:js执行-》浏览器计算样式布局 -》UI绘制 堵塞
  • 解决方法:异步更新、时间切片、React Fiber uTools_1683204151502.png 用React开发web应用 uTools_1683204670059.png 声明式编程——数据决定视图 声明式与命令式的主要区别在于,声明式描述的是结果,它不关心过程。比如 SQL,我们告述数据库的是,我们要查询某张表满足某某条件的数据,但我们并不会告述数据库怎么去查,怎么查数据是数据库系统自己关心的事情。 要有如下几个优点:
  1. 对系统使用方,通过设计声明式的接口,开发者无需关心底层实现,而更多的关注上层业务
  2. 对系统实现方,通过声明式的接口,上层使用者接口相对稳定前提下,系统可以不断的迭代优化
  3. 对整个系统而言,能够更系统的收集更多信息,能够依据策略进行系统行为优化,提升系统效率

函数式组件——没有生命周期 函数式组件就是函数是组件,组件是函数,它的特征是没有内部状态、没有生命周期钩子函数、没有this(不需要实例化的组件)。 在日常开发中,我们经常会开发一些纯展示性的业务组件,比如一些详情页面,列表界面等,它们有一个共同的特点是: 只要你传入数据,我就进行展现。 借助Hook、return JSX
为什么存在class组件,还增加Hook(更加清爽)

uTools_1683633841050.png

Hook规则:

  • 只能在最顶层使用
useEffect(function persistForm(){
if(firstRender.current){
  localStorage.seItem('formData',name);
  firstRender.current = false;
}
});
  • 只能在React函数中调用Hook、必须use开头
  • Hook本质就是函数,会形成闭包

uTools_1683634365749.png 常见Hook及作用 uTools_1683634616349.png

常见Hook使用——组件之间共享信息

划分组件 父组件给子组件通信 子组件给父组件通信 组件挂载位置

uTools_1683635620575.png

Hooks的种类

  • State hooks (在 function component 中使用 state)
  • Effect hooks (在 function component 中使用生命周期和 side effect)
  • Custom hooks (自定义 hooks 用来复用组件逻辑,解决了上述的第一个动机中阐述的问题)

State Hooks

import { useState } from 'react';

function Example() {
  // Declare a new state variable, which we'll call "count"
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}复制代码

Hooks会返回一个Tuple,结构为[value, setValue]

这两个返回值分别对应之前react里的

  • this.state
  • this.setState

我们还可以在函数中同时使用多个state

function ExampleWithManyStates() {
  // Declare multiple state variables!
  const [age, setAge] = useState(42);
  const [fruit, setFruit] = useState('banana');
  const [todos, setTodos] = useState([{ text: 'Learn Hooks' }]);
  // ...
}复制代码

之前更新state中值,通过this.setState({ fruit: 'orange' }),会对之前的state和更新后的state进行合并。

而使用Hooks,会将state进行拆分为一个个value,更新后,直接使用新值替换,不会进行state的合并。[state,setState]的结构也让值的更新逻辑更加清晰。 effectHooks让我们可以在函数组件内使用生命周期方法,我们可以在这里更新DOM,获取数据等具有'副作用'的行为。effect Hook会在组件每次render后执行,ruturn的函数会在组件卸载时执行,若要让effect hook只在组件首次加载时执行,可以传入一个空数组作为第二个参数,也可以在数组中指定依赖项,只有依赖项改变时,effectHooks才会执行。 强调一下react冒泡 他会一直冒泡到包含react树的祖先,即便这些元素并不是DOM树的祖先

uTools_1683636484399.png