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

34 阅读4分钟

简介

React是一个用于构建用户界面的JavaScript库,主要用于构建 UI,起源于Facebook的内部项目,用来架设Instagram的网站,其拥有较高的性能,代码逻辑非常简单

特点:

  • 声明式设计 −React采用声明方式,可以轻松描述应用。
  • 高效 −React通过对DOM的模拟,最大限度地减少与DOM的交互。
  • 灵活 −React可以与已知的库或框架很好地配合。
  • JSX − JSX 是 JavaScript 语法的扩展。React 开发不一定使用 JSX ,但我们建议使用它。
  • 组件 − 通过 React 构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中
  • 单向响应的数据流 − React 实现了单向响应的数据流,从而减少了重复代码

优点:

  • 快速响应:Fiber
  • 组化件:复用性强
  • 声明式编程
  • 跨平台:只需要修改渲染器

缺点:

  • 大型应用需要配套学习状态管理,路由工具
  • 不适合小型应用,需要用Babel处理

更新流程

  • 调度器(Scheduler)
    • 维护时间切片
    • 与浏览器任务
    • 优先级调度
  • 协调器(Reconciler)
    • 将JSX转化为Fiber
    • Fiber树对比(双缓存)
    • 确定本次更新的Fiber
  • 渲染器(Renderer)
    • 渲染器用于管理一棵react树,使其根据底层平台进行不同的调用

更新流程.png

基础

React开发web应用

React web应用

  • 架构
  • 路由
  • UI
  • 状态

React组件

  • 数据
  • 通信
  • UI
  • 性能

组件

Class组件

class组件是一种使用ES6类语法定义的React组件,它继承了React.Component类,可以通过定义render方法来输出组件的内容,同时也可以定义各种生命周期方法来控制组件的行为。 例如:

import React from 'react';

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }
  render() {
    return (
      <div>
        <h1>{this.props.title}</h1>
        <p>Count: {this.state.count}</p>
        <button onClick={() => this.setState({ count: this.state.count + 1 })}>+1</button>
      </div>
    );
  }
}

export default MyComponent;

函数式组件

函数式组件是一种定义React组件的方式,它是一个接收props参数并返回表示组件UI的React元素的JavaScript函数。

函数式组件没有类组件那样的生命周期,也不能定义局部状态(state),所以它更易于理解和使用,尤其在简单的组件或简单场景下使用函数式组件可以减少代码冗余。

React 16.8引入了Hooks,使得函数式组件也能够使用类组件的生命周期和状态,甚至更方便和强大。通过useEffect、useState、useContext等Hooks,函数式组件能够更好地实现组件的复杂逻辑和交互效果。 例如:

import React, { useEffect, useState } from 'react';

function MyComponent(props) {
  const [count, setCount] = useState(0);
  useEffect(() => {
    document.title = `You clicked ${count} times`;
  }, [count]);

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

export default MyComponent;

比较

函数式相较于class组件

  • 代码量骤减,组件干净清爽
  • 没有复杂的生命周期
  • 支持自定义hook,逻辑复用方便

组件&Hook

将UI拆成多个独立单元,这些单元组合可以构成多种视图展示,这些独立单元就是组件组件相当于原子

hook贴近组件内部运行的各种概念逻辑,effect、state、context等,hooks更接近于电子

Hook

Hook是React 16.8引入的一个重要Hook是React 16.8引入的一个重要概念,它使得函数式组件具有了类组件的能力,可以使用类组件的生命周期、状态和其他功能,也可以更方便地处理组件间逻辑和数据共享。

规则&原理:

  • 只在函数的顶层使用Hook:确保Hook在每次渲染后都会被调用,从而保证Hook所使用的依赖项是最新的。
  • 只在React函数中调用Hook:确保只有React函数才能使用Hook,这样才能与React的更新机制正确连接起来。
  • 在条件语句和循环语句中使用Hook时,确保它们在每个分支中都有相同的顺序,并且包含了相同的Hooks:保证每次渲染时的Hook顺序是相同的,从而保证其稳定性。
  • 每个自定义Hook都应该只包含单一的功能:保证自定义Hook的复用性和清晰性。

过期闭包问题

在JS中,函数运行的上下文是由定义的位置来决定。当函数的闭包包住了旧的变量值时,就出现了过期闭包的问题

常见API

API.png

常见Hook

Hook.png

具体场景案例

如何划分组件

Layout

layout.png

Page

page.png

Component

component.png

父组件给子组件通信

子组件给父组件通信

组件间共享信息

组件性能优化

组件挂载位置

如何进行逻辑复用

总结

总结.png

资料及工具

React最新教程

React官网教程

React技术揭秘

一文吃透react-hooks原理

Arco Design