前言

现在几乎所有的单页面应用框架都大同小异,也就是意味着你只要精通一个框架其他的思想基本保持了一致,现在主流的reactvue也是如此,二者版本迭代也在逐渐的吸取对方的优势,他们的语法也将越来越接近。

小编最早接触react得时候,es6正是流行的时候,vue框架也刚刚起步,那时候react还基本都是通过class组件继承的形式来开发整个应用。随着不断的版本升级,react也迎来了历史性的重大改变。接下来看一下react历史性的变化。

react16.8新增Hook

它的出现绝对堪称react的历史性突破,组件不在局限于class继承的写法,而是以一个函数的形式,同时也提供了更为直观强大的api,props, state,context,refs 以及生命周期等。几乎能覆盖class写法的api

如果使用的是函数式组件,也能同时帮我们省去大量的重复的代码判断,如:

#mermaid-svg-0hbmSuyhVMcmx0vx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0hbmSuyhVMcmx0vx .error-icon{fill:#552222;}#mermaid-svg-0hbmSuyhVMcmx0vx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0hbmSuyhVMcmx0vx .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-0hbmSuyhVMcmx0vx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0hbmSuyhVMcmx0vx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0hbmSuyhVMcmx0vx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0hbmSuyhVMcmx0vx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0hbmSuyhVMcmx0vx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0hbmSuyhVMcmx0vx .marker.cross{stroke:#333333;}#mermaid-svg-0hbmSuyhVMcmx0vx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0hbmSuyhVMcmx0vx .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0hbmSuyhVMcmx0vx .cluster-label text{fill:#333;}#mermaid-svg-0hbmSuyhVMcmx0vx .cluster-label span{color:#333;}#mermaid-svg-0hbmSuyhVMcmx0vx .label text,#mermaid-svg-0hbmSuyhVMcmx0vx span{fill:#333;color:#333;}#mermaid-svg-0hbmSuyhVMcmx0vx .node rect,#mermaid-svg-0hbmSuyhVMcmx0vx .node circle,#mermaid-svg-0hbmSuyhVMcmx0vx .node ellipse,#mermaid-svg-0hbmSuyhVMcmx0vx .node polygon,#mermaid-svg-0hbmSuyhVMcmx0vx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0hbmSuyhVMcmx0vx .node .label{text-align:center;}#mermaid-svg-0hbmSuyhVMcmx0vx .node.clickable{cursor:pointer;}#mermaid-svg-0hbmSuyhVMcmx0vx .arrowheadPath{fill:#333333;}#mermaid-svg-0hbmSuyhVMcmx0vx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0hbmSuyhVMcmx0vx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0hbmSuyhVMcmx0vx .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-0hbmSuyhVMcmx0vx .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-0hbmSuyhVMcmx0vx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0hbmSuyhVMcmx0vx .cluster text{fill:#333;}#mermaid-svg-0hbmSuyhVMcmx0vx .cluster span{color:#333;}#mermaid-svg-0hbmSuyhVMcmx0vx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0hbmSuyhVMcmx0vx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

componentDidMount + componentDidUpdate + componentWillUnmount
useEffect

React18并发

大家都知道js是单线程的编程语言,即上游不执行结束,下游就会有对应的影响,对用户来讲很有可能界面就会面临短暂性的卡死情况。假如我们执行了一次setState,但是这个setState是比较耗时的,这时候用户在此期间几乎是无法交互的。因此在react18中提出了并发这个概念

react团队基于时间切片(time slicing)Scheduler调度完成了此类的优化,其实就是通过Fiber结构将不紧急的更新拆分成多段更新,并通过宏任务的方式将其合理分配到浏览器的帧当中。

react18新增了几个对应的Hook API:

Suspense 新增fallback属性

在v18中,Suspense加入了fallback属性,用于将读取数据和指定加载状态分离。这样就不用去过多的关注页面的加载状态,也能节约大量的代码。

<Suspense fallback={<div>Loading...</div>}><components />
</Suspense>
useTransition/useDeferredValue

由于渲染界面会占用线程,因此导致用户输入时,无法立即响应,useDeferredValue快速变化的时候,React会合并触发的更新,渲染最后的一个更新。
常见的像防抖节流的函数,虽然利用了setTimeout解决了频繁触发的问题,但是是无法解决更新耗时过长的问题。
在每次更新之前,useTransition会将优先级更新为transition,低优先级进行,再通过时间切片的形式,从而不阻塞其他紧急的渲染。

import React, { useState, useDeferredValue, useTransition } from 'react'const Defer = () => {const [searchValue, setSearchValue] = useState(100)const deferredSearchValue = useDeferredValue(searchValue)const [loading, startTransition] = useTransition(500);return (<><inputtype="number"value={searchValue}onChange={(e) => {startTransition(()=>{setSearchValue(Number(e.target.value) || 0)})}}/>{loading?(<p>loading...</p>):(new Array(deferredSearchValue).fill(0).map((_, idx) => (<li key={idx}>{idx}</li>)))}</>)
}export default Defer 
useSyncExternalStore

相当于对并发更新使用到的额外数据进行监听,当并发更新时数据发生变化,进行强制渲染。这个通常我们的实际业务中用不到,可以自行了解。

react这几年重大意义的变化相关推荐

  1. [react] React中如何监听state的变化?

    [react] React中如何监听state的变化? 16.x 之前使用componentWillReveiveProps componentWillReceiveProps (nextProps) ...

  2. react引入多个图片_重新引入React:v16之后的每个React更新都已揭开神秘面纱。

    react引入多个图片 In this article (and accompanying book), unlike any you may have come across before, I w ...

  3. react 组件遍历】_从 Context 源码实现谈 React 性能优化

    (给前端大全加星标,提升前端技能) 转自:魔术师卡颂 学完这篇文章,你会收获: 了解Context的实现原理 源码层面掌握React组件的render时机,从而写出高性能的React组件 源码层面了解 ...

  4. React基础学习(第一天)

    React 概述 : React 是一个用于 构建用户界面 的 JavaScript 库 因为框架是有一整套解决方案的,React就是纯粹写UI组件的 没有什么异步处理机制.模块化.表单验证这些.Re ...

  5. diff算法_详解 React 16 的 Diff 策略

    这是我 Deep In React 系列的第二篇文章,如果还没有读过的强烈建议你先读前一篇:详谈 React Fiber 架构(1). 前言 我相信在看这篇文章的读者一般都已经了解过 React 16 ...

  6. react黑马前端学习笔记

    React 一.React概述 1.1简介 react是一个用于构建用户界面的js库 用户界面:HTML页面 React主要用来写HTML页面或者构建Web应用 如果从MVC的角度来看,React仅仅 ...

  7. 深入研究vue还是再学react,vue 和 react 哪个前景好

    各位前辈,如今学vue还是react呢,感觉vue是国产的,迟早超越react,但是适合做APP吗? 1.首先国内很多公司近年来对vue的使用呈上升态势的.也有使用vue通过不同的打包方式打包成app ...

  8. Web前端-React学习

    React基础 React 概述 React 是一个用于构建用户界面的JavaScript库. 用户界面: HTML页面(前端) React主要用来写HTML页面, 或构建Web应用 如果从MVC的角 ...

  9. 前端每周清单第 33 期:React 16 发布与特性介绍,Expo AR 教程,ExtJS 从崛起到沉寂...

    前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点:分为新闻热点.开发教程.工程实践.深度阅读.开源项目.巅峰人生等栏目.欢迎关注[前端之巅]微信公众号(ID:front ...

最新文章

  1. GdiPlus[44]: IGPGraphics (三) 关于文本绘制续 - IGPStringFormat
  2. 关于linux shell脚本开头的#!/bin/sh
  3. 13、Power Query-逆透视列的解析(上)
  4. python replace_DF.replace介绍
  5. CodeForces - 1373F Network Coverage(二分)
  6. 结对开发——返回一个整数数组中最大子数组的和 (首尾相接版)
  7. head first java原文_Head First Java
  8. 修改CentOS系统的默认启动级别
  9. 快速崛起的物联网世界安全问题
  10. 解决hash冲突的三个方法
  11. 双指针 -- 验证回文串
  12. loadrunner ftp linux,loadrunner ftp协议使用详细步骤
  13. VC++常用数据类型
  14. 2016.7.27 VS搜索正则表达式,在UltraEdit中可选用Perl正则引擎,按C#语法搜索
  15. 阿里云云计算 8 ECS的实例规格
  16. 第十四届恩智浦智能车竞赛小白四轮硬件总结
  17. 让以前的淘帝起死回生,淘客帝国 n…
  18. 【Android】我用 ARCore 做了一个 1:1 的高达
  19. jvm之java类加载机制和类加载器(ClassLoader)的详解
  20. 微信开发者工具调试H5项目报错:XXXXfail, the permission value is offline verifying解决方案

热门文章

  1. 图解HTTP-简单的HTTP协议
  2. mysql与sql哪个简单_Sql与MySQL简单入门
  3. 数据结构(c++)--炸弹人游戏(BFS)
  4. JS 按字符串长度切割字符串(支持汉字占2个长度)
  5. android 无损压缩
  6. springboot毕设项目网上图书商城q3ulr(java+VUE+Mybatis+Maven+Mysql)
  7. JupyterLab 格式化代码插件
  8. NE40E/NE80E 端口镜像抓包
  9. 10086登录JS加解密充值讲解
  10. Java模拟植物大战僵尸(交互)