React全家桶(技术栈)

image-20230311091545266

说明:这个文档是依据尚硅谷官方文档复制下来的,可能排版不是很好,因为是从word直接粘贴的,我在官方文档的基础上增加了里面的实例,应该说内容会丰富一些。

注意:我下面的代码中,有一些在jsx中的render(){}里面使用js注释的方法,其实是错误的,jsx中的注释必须放在{}中,是这样的{/* 注释内容 */},可能会有没有改到的地方,需要注意。

第1章:React入门

1.1. React简介

1.1.1. 官网

  1. 英文官网: https://reactjs.org/
  2. 中文官网: https://react.docschina.org/,新版文档(全面推进hooks):https://react.bootcss.com/

1.1.2. 介绍描述

  1. 用于动态构建用户界面的 JavaScript 库(只关注于视图)
  2. 由Facebook开源image-20230311091910657

1.1.3. React的特点

原生JS的痛点:

image-20230311092559709

react的设计目标就是解决上面的问题,由此得出了react的优点:

image-20230311093103849

  1. 声明式编码
  2. 组件化编码
  3. React Native 编写原生应用
  4. 高效(优秀的Diffing算法)

1.1.4. React高效的原因

  1. 使用虚拟(virtual)DOM, 不总是直接操作页面真实DOM。
  2. DOM Diffing算法,最小化页面重绘重排。

image-20230311093810322

一直以来都有一个疑问:为什么diff算法可以减少重绘重排?最终都需要转换为DOM给浏览器渲染的,不管是原生JS还是react/vue,重新生成的DOM应该是一样的啊,哪里减少了呢?

要搞清楚这个问题,首先要搞清楚什么是“重绘重排”。重绘重排是浏览器的行为,浏览器的重绘(repaint)和重排(reflow)是指浏览器对网页进行重新渲染的过程。重排是指重新计算网页布局的过程,而重绘则是根据新的布局信息重新绘制网页的过程。它们的区别在于,重排会导致元素的尺寸、位置、内容等属性的变化,因此需要重新计算布局信息;而重绘则是在元素的位置和尺寸等属性不变的情况下,重新绘制元素的样式。(原文链接:https://blog.csdn.net/tyxjolin/article/details/129865766

然后要搞清楚浏览器渲染网页的原理(参考我的《浏览器渲染原理》文件),简单讲就是网页会被浏览器渲染引擎转换为DOM树结构,而重绘重排就是改变了DOM树结构导致的结果。

那么为什么diff算法可以减少重绘重排呢?因为diff算法有一个重要操作:给DOM树打补丁。这个就是重点,diff算法将DOM节点转换为JS对象,通过算法比对,将差异的地方标记出来(记为patch),然后将patch打补丁到DOM树上(操作原生JS时,虽然更改的是同样的地方,但实际上是更改了一大块DOM结构。这是由DOM本身造成的,一个普通DOM身上的属性太多太多了,而diff算法可以极大的精细化这个差异点。),这样就会引起浏览器重新渲染,而这个重新渲染的过程,浏览器其实也知道该怎么渲染,浏览器不是重新渲染全部DOM,而是重绘重排,将差异化的内容渲染到页面上。

打补丁的过程,参考vue设计原理,这里有一个简单实现:https://juejin.cn/post/7151916642652389389

1.2. React的基本使用

1.2.1. 效果

image-20211104215527319

1.2.2. react依赖包里面的相关js库

  1. react.development.js:React核心库。
  2. react-dom.development.js:提供操作DOM的react扩展库。
  3. babel.min.js:解析JSX语法代码转为JS代码的库,将ES6转为ES5。
  4. prop-types.js:暂时没有讲到。
第一个例子

说明:

因为markdown里面的代码对于<script type="text/babel"></script>里面的渲染不是很好,都是白色的代码,不管是html还是jsx的显示效果都不好,所以后面的代码中,只要文件类型是html的,我都只保留了jsx的部分,另外加上了部分html的代码,所以要看清楚。

1.2.3. 创建虚拟DOM的两种方式

image-20211104220013195

1、纯JS方式(一般不用)

可以看到,使用js来创建虚拟DOM,不需要引入babel.js,使用的是React.createElement方法。事实上,使用jsx来写的内容,都会被babel转义为js的这些内容,但是这个转义的过程不需要管,属于react工作原理的范畴,编写的时候,要用jsx的方式来编写,这样才达到了发明jsx的目的,简化编写过程。

2、JSX方式

使用jsx的方式来创建虚拟DOM,可以非常方便的添加元素,同时嵌套信息也很清楚。

1.2.4. 虚拟DOM与真实DOM

  1. React提供了一些API来创建一种 “特别” 的一般js对象

const VDOM = React.createElement('',{id:''},'')

上面创建的就是一个简单的虚拟DOM对象。

  1. 虚拟DOM对象最终都会被React转换为真实的DOM,呈现在页面上。
  2. 我们编码时基本只需要操作react的虚拟DOM相关数据, react会转换为真实DOM变化而更新界面。

1.3. React JSX

1.3.1. 效果

image-20211104222713993

1.3.2. JSX

  1. 全称:JavaScript XML
  2. 是react定义的一种类似于XML的JS扩展语法: JS + XML本质是React.createElement(component,props, ...children)方法的语法糖
  3. 作用: 用来简化创建虚拟DOM

①写法:var ele = <h1>Hello JSX!</h1>

②注意1:它不是字符串, 也不是HTML/XML标签

③注意2:它最终产生的就是一个JS对象

  1. 标签名任意: HTML标签或其它标签
  2. 标签属性任意: HTML标签属性或其它
  3. 基本语法规则

①遇到 <开头的代码, 以标签的语法解析: html同名标签转换为html同名元素, 其它标签需要特别解析

②遇到以 {开头的代码,以JS语法解析: 标签中的js表达式必须用{ }包含

  1. babel.js的作用

①浏览器不能直接解析JSX代码,需要babel转译为纯JS的代码才能运行

②只要用了JSX,都要加上type="text/babel",声明需要babel来处理

1.3.3. 渲染虚拟DOM(元素)

  1. 语法: ReactDOM.render(virtualDOM,containerDOM)
  2. 作用: 将虚拟DOM元素渲染到页面中的真实容器DOM中显示
  3. 参数说明

①参数一: 纯js或jsx创建的虚拟dom对象

②参数二: 用来包含虚拟DOM元素的真实dom元素对象(一般是一个div)

1.3.4. JSX练习

需求: 动态展示如下列表

image-20211104223123219

image-20211122130350139

语句和表达式是不同的,这一点一定要弄清楚。那么在jsx的{}里面,数据为空时显示数据空提示图片,有数据时显示表格界面,应该怎么做呢?

这时候不能使用if或switch来判断,因为这是js语句,而应该使用三元表达式,三元表达式总会返回一个值。

如果有嵌套的判断条件,就嵌套使用三元表达式,这是我目前看到的解决方案,如果有更好的方法,就记录下来。

1.4. 模块与组件、模块化与组件化的理解

1.4.1. 模块

  1. 理解:向外提供特定功能的js程序, 一般就是一个js文件
  2. 为什么要拆成模块:随着业务逻辑增加,代码越来越多且复杂。
  3. 作用:复用js, 简化js的编写, 提高js运行效率

1.4.2. 组件

  1. 理解:用来实现局部功能效果的代码和资源的集合(html/css/js/image等等)
  2. 为什么要用组件: 一个界面的功能更复杂
  3. 作用:复用编码, 简化项目编码, 提高运行效率

1.4.3. 模块化

当应用的js都以模块来编写的, 这个应用就是一个模块化的应用

1.4.4. 组件化

当应用是以多组件的方式实现, 这个应用就是一个组件化的应用

image-20211118171216641

第2章:React面向组件编程

2.1. 基本理解和使用

2.1.1. 使用React开发者工具调试

image-20211118171156510

image-20211122132443499

image-20211122132537693

image-20211122132645480

2.1.2. 效果

函数式组件:

image-20211118171137189

类式组件:

image-20211118171146371

复杂组件和简单组件可以根据有没有state(状态)来区分,有state的就是复杂组件,没有就是简单组件。(当然,这是老师为了让教学更简单做出的定义,其实函数式组件可以使用hooks来定义state,函数式组件是现在react主推的编写方式,具体看项目要求)

image-20230311202251654

2.1.3. 注意

  1. 组件名必须首字母大写
  2. 虚拟DOM元素只能有一个根元素
  3. 虚拟DOM元素必须有结束标签

2.1.4. 渲染类组件标签的基本流程

  1. React内部会创建组件实例对象
  2. 调用render()得到虚拟DOM, 并解析为真实DOM
  3. 插入到指定的页面元素内部

2.2. 组件三大核心属性之一: state

三大核心属性的前提是用class定义的组件,而function定义的组件是不会有这三大属性的(在hooks之前)。这里的标题“组件三大核心属性之一”其实是“组件实例的三大核心属性之一”,这里简写了。

但是最新版的react提供了hooks方法,也可以让function定义的组件有三大属性,那是后面的内容,到时候可以仔细比较。

2.2.1. 效果

需求: 定义一个展示天气信息的组件

1. 默认展示天气炎热 凉爽

2. 点击文字切换天气

2.2.2. 理解

  1. state是组件对象最重要的属性, 值是对象(可以包含多个key-value的组合)
  2. 组件被称为"状态机", 通过更新组件的state来更新对应的页面显示(重新渲染组件)

2.2.3. 强烈注意

  1. 组件中render方法中的this为组件实例对象
  2. 组件自定义的方法中this为undefined,如何解决?

a) 强制绑定this: 通过函数对象的bind()

b) 箭头函数

  1. 状态数据,不能直接修改或更新

例子:

可以将上面的代码精简一下:

2.3. 组件三大核心属性2: props

2.3.1. 效果

需求: 自定义用来显示一个人员信息的组件

1. 姓名必须指定,且为字符串类型;

2. 性别为字符串类型,如果性别没有指定,默认为男

3. 年龄为数字类型,默认值为18

image-20211118171010914

props简写方式:

2.3.2. 理解

  1. 每个组件对象都会有props(properties的简写)属性
  2. 组件标签的所有属性都保存在props中

2.3.3. 作用

  1. 通过标签属性从组件外向组件内传递变化的数据(看到数据,不要忘记方法也可以传递哦)
  2. 注意: 组件内部不要修改props数据,props数据是只读的。

2.3.4. 编码操作

  1. 内部读取某个属性值
  1. 对props中的属性值进行类型限制和必要性限制

第一种方式(React v15.5 开始已弃用):

第二种方式(新):使用prop-types库进限制(需要引入prop-types库)

  1. 扩展属性: 将对象的所有属性通过props传递
  1. 默认属性值:
  1. 组件类的构造函数

image-20230312160518759

函数式组件使用props

因为函数可以接收参数,所以组件实例的三大属性里面,函数式组件可以使用props。

2.4. 组件三大核心属性3: refs与事件处理

2.4.1. 效果

需求: 自定义组件, 功能说明如下:

1. 点击按钮, 提示第一个输入框中的值

2. 当第2个输入框失去焦点时, 提示这个输入框中的值

效果如下:

2.4.2. 理解

组件内的标签可以定义ref属性来标识自己

2.4.3. 编码

  1. 字符串形式的ref

字符串形式的ref存在效率问题,所以官方现在不推荐使用,但是react16.8版本之前的项目都在大量使用,所以还是有必要了解并使用的,react16.8之后的版本推荐下面两种使用方式。

而且字符串式的ref,使用起来也不是那么方便,完全可以用useRef()来代替。

  1. 回调形式的ref

关于回调 refs 的说明(摘自官方文档)

如果 ref 回调函数是以内联函数的方式定义的,在更新过程中它会被执行两次,第一次传入参数 null,然后第二次会传入参数 DOM 元素。这是因为在每次渲染时会创建一个新的函数实例,所以 React 清空旧的 ref 并且设置新的。通过将 ref 的回调函数定义成 class 的绑定函数的方式可以避免上述问题,但是大多数情况下它是无关紧要的。

虽然写成内联形式会有这种问题,但还是推荐写成内联形式,因为没什么影响。如果非要较真,那么就写成绑定函数的形式。

image-20211123105009093

可以使用绑定函数的形式避免这种问题:

image-20211123105212712

  1. createRef创建ref容器

这种方式是目前React官方最推荐的写法。

2.4.4. 事件处理

  1. 通过onXxx属性指定事件处理函数(注意大小写)

    1)React使用的是自定义(合成)事件, 而不是使用的原生DOM事件(为了更好兼容性)

    2)React中的事件是通过事件委托方式处理的(委托给组件最外层的元素),目的是为了高效。

  2. 通过event.target得到发生事件的DOM元素对象(不要过度使用ref,如果发生事件的元素是你要操作的元素,那么直接用event.target

官方提示不要过度使用ref,那么就可以使用event.target得到发生事件的DOM元素对象。

 

注意:

上面对使用event.target的使用似乎限定了范围,“如果发生事件的元素是你要操作的元素,那么直接用这种方法”,那点击按钮提示左侧输入框数据只能使用ref了吗?

当然不是,左侧的input框也可以绑定onBlur、onChange等事件,使用event.target,然后取出值保存在state中,等点击按钮的时候从state中拿出来使用。所以要借助state的能力。

2.5. 收集表单数据

2.5.1. 效果

需求: 定义一个包含表单的组件

输入用户名密码后, 点击登录提示输入信息

2.5.2. 理解

包含表单的组件分类

  1. 非受控组件

输入类组件的内容需要用的时候就取出来,就是非受控组件。用到了表单本身的一个属性event.preventDefault(),阻止表单提交。

  1. 受控组件

受控组件:所有输入类的DOM,随着输入,及时将输入内容保存到状态中,要使用的时候就从状态里面拿出来,就叫受控组件。推荐使用受控组件,因为受控组件里面几乎没有用到ref,这是官方文档所推荐的(并不是说不能使用ref,如果一些情况下非写ref不可,那就直接写,不要有心理负担)。

大部分时候推荐使用受控组件来实现表单,因为在受控组件中,表单数据由react组件负责处理。如果使用非受控组件的话,控制能力较弱,表单数据由dom本身处理,但更加方便快捷,代码量少。

应用场景如下图:

img

既然非受控组件的应用场景这么少,那么就都用受控组件就行了。

在讲组件的生命周期之前,老师讲了一下高阶函数和函数柯里化,下面这个概念非常重要,可以帮助我减轻很大的负担,注意这个柯里化的写法,我想了很久都没有写出来,我之前写vue和小程序的时候,早就想这么写了,但就是写不出来

不用柯里化的写法:

不用柯里化的写法为什么可以这样写?因为onChange后面直接写了一个函数,而这个函数本身就有一个event的参数,可以直接提供给别的函数。

高阶组件能够提高代码的复用性和灵活性,在实际应用中,常常用于与核心业务无关但又在多个模块使用的功能,如权限控制、日志记录、数据校验、异常处理、统计上报等。

2.6. 组件的生命周期

2.6.1. 效果

需求:定义组件实现以下功能:

1. 让指定的文本做显示 / 隐藏的渐变动画

2. 从完全可见,到彻底消失,耗时2S

3. 点击“不活了”按钮从界面中卸载组件

从例子中可以看出,componentDidMountcomponentWillUnmountrender函数一样,都是react提供的函数,所以写法都可以写成函数的形式。

2.6.2. 理解

  1. 组件从创建到死亡会经历一些特定的阶段。
  2. React组件中包含一系列勾子函数(生命周期回调函数),会在特定的时刻调用。
  3. 我们在定义组件时,会在特定的生命周期回调函数中,做特定的工作。

2.6.3. 生命周期流程图(旧)

image-20211118170123214

生命周期的三个阶段(旧)

1. 初始化阶段: 由ReactDOM.render()触发---初次渲染

1)constructor()

2)componentWillMount()

3)render(),必须使用的一个钩子函数。

4)componentDidMount(),此钩子函数很常用,一般在这里做初始化的事情,比如说:开启定时器、发送网络请求、订阅消息。

2. 更新阶段: 由组件内部this.setState()或父组件重新render触发

1)shouldComponentUpdate()

2)componentWillUpdate()

3)render()

4)componentDidUpdate()

更新的过程有三种情况:

注意:看这张图时,并不是“挂载时”和“父组件render”组成了两部分,这个并不是标题,而是一个触发机制名称,应该是这样看:“挂载时”、“父组件render”、“setState()”、“forceUpdate()”是类似的东西,即一种触发机制名称。

image-20230318160535652

3. 卸载组件:ReactDOM.unmountComponentAtNode()触发

1)componentWillUnmount(),此钩子函数常用,一般在这里做一些收尾的事情,例如:关闭定时器、取消订阅消息。

image-20230318162256661

2.6.4. 生命周期流程图(新)

image-20230319154217005

image-20230319151936010

image-20230319154057633

老师用了一个例子来说明getSnapshotBeforeUpdate()函数有什么作用:

一个新闻列表,当新闻内容多了之后,产生滚动条,用户在滚动到某个位置的时候,需要固定在这个位置,让用户能够好好地看,由于新闻不断增加,实际上的位置都会回到最新的位置。需要解决这个问题。

这个案例实现的就是:滚动条滚动到哪里,就可以固定在哪里,这在微信里面可以看到,比如说关注了很多公众号,公众号不断推送消息,我想看哪一个消息就滚动到哪里,不会因为推送的消息而产生滚动。这个功能还是蛮实用的。

总结:生命周期的三个阶段(新)

  1. 初始化阶段: 由ReactDOM.render()触发---初次渲染

    1)constructor()

    2)getDerivedStateFromProps

    3)render()

    4)componentDidMount()

  2. 更新阶段: 由组件内部this.setState()或父组件重新render触发

    1)getDerivedStateFromProps

    2)shouldComponentUpdate()

    3)render()

    4)getSnapshotBeforeUpdate

    5)componentDidUpdate()

  3. 卸载组件: 由ReactDOM.unmountComponentAtNode()触发

    1)componentWillUnmount()

2.6.5. 重要的勾子

  1. render:初始化渲染或更新渲染调用
  2. componentDidMount:开启监听, 发送ajax请求
  3. componentWillUnmount:做一些收尾工作, 如: 清理定时器

2.6.6. 即将废弃的钩子

  1. componentWillMount
  2. componentWillReceiveProps
  3. componentWillUpdate

现在使用会出现警告,下一个大版本需要加上UNSAFE_前缀才能使用,以后可能会被彻底废弃,不建议使用。

2.6.8. 新生命周期新增的钩子

1、getDerivedStateFromProps

2、getSnapshotBeforeUpdate

面试题:react的新、旧生命周期有什么区别?

react新生命周期废弃了3个生命周期钩子函数:componentWillMountcomponentWillReceivePropscomponentWillUpdate,新增了2个生命周期钩子函数:getDerivedStateFromPropsgetSnapshotBeforeUpdate,再说一说新钩子函数的作用即可。

可以在这个网站找到很多前端开源项目CDN地址 https://www.bootcdn.cn/

2.7. 虚拟DOM与DOM Diffing算法

2.7.1. 效果

需求:验证虚拟DOM Diffing算法的存在

从上面可以看出,diffing算法的最小粒度是标签span标签里面的“现在是:”这几个文字虽然没有变化,但是react没有办法识别出这些文字没有变化,只能识别出标签变化没有。同时标签是有层级的,所以diffing还是可以识别出不同层级标签的diffing的,举个例子:一个顶级标签,里面一个内容变化了,里面的其余标签是不是会跟着变化呢?不会跟着变化,因为层级不一样,diffing是可以识别的。

为什么需要Key?

input里面的值是自己输入进去的,供查看不同的key对应在添加人员后的情况。

image-20230319173026737

image-20230319172856937

经典面试题:

1). react/vue中的key有什么作用?(key的内部原理是什么?)

2). 为什么遍历列表时,key最好不要用index?

  1. 虚拟DOM中key的作用:

1). 简单的说: key是虚拟DOM对象的标识, 在更新显示时key起着极其重要的作用。

2). 详细的说: 当状态中的数据发生变化时,react会根据【新数据】生成【新的虚拟DOM】, 随后React进行【新虚拟DOM】与【旧虚拟DOM】的diff比较,比较规则如下:

a. 旧虚拟DOM中找到了与新虚拟DOM相同的key:

(1).若虚拟DOM中内容没变, 直接使用之前的真实DOM

(2).若虚拟DOM中内容变了, 则生成新的真实DOM,随后替换掉页面中之前的真实DOM

b. 旧虚拟DOM中未找到与新虚拟DOM相同的key

根据数据创建新的真实DOM,随后渲染到到页面

  1. 用index作为key可能会引发的问题:

1、若对数据进行:逆序添加、逆序删除等破坏顺序操作:

会产生没有必要的真实DOM更新 ==> 界面效果没问题, 但效率低。

2、如果结构中还包含输入类的DOM:

会产生错误DOM更新 ==> 界面有问题。

3、注意!如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,

仅用于渲染列表用于展示,使用index作为key是没有问题的。

  1. 开发中如何选择key?:

1、最好使用每条数据的唯一标识作为key, 比如id、手机号、身份证号、学号等唯一值。

2、如果确定只是简单的展示数据,用index也是可以的。

2.7.2. 基本原理图

image-20211118165655855

第3章:React应用(基于React脚手架)

提示:

在写react项目时,标签写起来很麻烦,不能像写html标签那样,写出标签然后按tab键就自动生成了。现在按tab键是没有反应的,需要进行配置。

打开vscode的settings.json文件,然后加上这段代码:

然后写双标签的就可以这样做:先写标签名,然后按tab键,就自动生成了。写单标签可以这样做:先写标签名/,然后按tab键,就自动生成了。注意在js和jsx中写标签时,前面应该有个空格,否则按tab键会将前面的部分都当成标签名。

示例:

3.1. 使用create-react-app创建react应用

3.1.1. react脚手架

  1. xxx脚手架: 用来帮助程序员快速创建一个基于xxx库的模板项目

① 包含了所有需要的配置(语法检查、jsx编译、devServer…)

② 下载好了所有相关的依赖

③ 可以直接运行一个简单效果

  1. react提供了一个用于创建react项目的脚手架库: create-react-app
  2. 项目的整体技术架构为: react + webpack + es6 + eslint
  3. 使用脚手架开发的项目的特点: 模块化, 组件化, 工程化

3.1.2. 创建项目并启动

第一步,全局安装:npm i -g create-react-app

第二步,切换到想创项目的目录,使用命令:create-react-app hello-react

第三步,进入项目文件夹:cd hello-react

第四步,启动项目:npm start

image-20230325125427739

项目生成之后,有一个yarn eject或者npm run eject命令,这个命令是把create-react-app脚手架封装好的webpack文件全部显示出来,让用户来配置。默认create-react-app是隐藏webpack的文件的,而且没有必要完全可以不管这个webpack是怎么运行的。除非你非常牛,原理什么的都搞清楚了,可以来配置,否则没有必要来配置。

老师说到了一个很重要的点,我以前没有搞懂的,就是脚手架是怎么做出来的。其实vue-cli、create-react-app都是基于webpack做出来的,最初学习vue的时候,我也学过webpack,只不过后来学习了脚手架之后,就没有webpack来配置项目了。不过有时间还是可以将webpack搞清楚的,因为有时候真的需要对项目进行配置。

3.1.3. react脚手架项目结构

/public/index.html文件说明:

 

/src/index.js文件:

react项目主要的文件:public/index.htmlsrc/app.jssrc/index.js

有一点需要澄清:我记得刚开始学习vue的时候,老师说到了vue是用来做SPA项目的,但是我一直有一个误解,就是如果不是SPA,是更复杂的项目,可以用react来写,叫作MPA(多页面应用程序)。可是我看了create-react-app创建的项目,主文件还是一个root根节点,天禹老师也明确说了react是用来做SPA项目的,这里要明确一点,react主要是用来做SPA项目的,但是可以用来做MPA项目,参考:https://blog.csdn.net/weixin_28710515/article/details/107709288。关于SPA和MPA项目的区别,可以参考:https://www.jianshu.com/p/a8b5eb1f0f5d

看了老师的讲解,发现React的项目结构还是蛮熟悉的,因为小程序是模仿react做的,所以结构是类似的。小程序规定的详细一些。

image-20211125204656891

重点import react, {Component} from "react"这里的{Component}不是解构赋值,而是分别暴露的对象的引入操作。

image-20230325144721344

在之前的学习React的时候,类定义的组件都是extends React.Component,说明React身上确实有Component这个属性,但是react库里面同时定义了Component这个类,可以直接引入。就像上面的例子那样。

react中使用import引入文件时,js和jsx文件可以不写后缀名。

样式的模块化

image-20230502103401443

image-20230502103634446

老师说样式的模块化用的不多,用的多的还是less或sass,但必须要知道可以这样用。

但是这里还没有讲到怎么给项目里面添加less或sass,因为在vue项目中,加入了less或sass是需要进行配置的,这里还没有讲怎么使用。

react插件

image-20230502104436867

先记住下面几个快捷键,别的再说。

React

PrefixMethod
imr→import React from 'react'
imrd→import ReactDOM from 'react-dom'
imrc→import React, { Component } from 'react'
imrpc→import React, { PureComponent } from 'react'
imrm→import React, { memo } from 'react'
imrr→import { BrowserRouter as Router, Route, NavLink} from 'react-router-dom'
imbr→import { BrowserRouter as Router} from 'react-router-dom'
imbrc→import { Route, Switch, NavLink, Link } from react-router-dom'
imbrr→import { Route } from 'react-router-dom'
imbrs→import { Switch } from 'react-router-dom'
imbrl→import { Link } from 'react-router-dom'
imbrnl→import { NavLink } from 'react-router-dom'
imrs→import React, { useState } from 'react'
imrse→import React, { useState, useEffect } from 'react'
redux→import { connect } from 'react-redux'
est→this.state = { }
cdm→componentDidMount = () => { }
scu→shouldComponentUpdate = (nextProps, nextState) => { }
cdup→componentDidUpdate = (prevProps, prevState) => { }
cwun→componentWillUnmount = () => { }
gdsfp→static getDerivedStateFromProps(nextProps, prevState) { }
gsbu→getSnapshotBeforeUpdate = (prevProps, prevState) => { }
sst→this.setState({ })
ssf→this.setState((state, props) => return { })
props→this.props.propName
state→this.state.stateName
rcontext→const $1 = React.createContext()
cref→this.$1Ref = React.createRef()
fref→const ref = React.createRef()
bnd→this.methodName = this.methodName.bind(this)

3.1.4. 功能界面的组件化编码流程(通用)

  1. 拆分组件: 拆分界面,抽取组件
  2. 实现静态组件: 使用组件实现静态页面效果
  3. 实现动态组件

3.1 动态显示初始化数据

3.1.1 数据类型

3.1.2 数据名称

3.1.3 保存在哪个组件?

3.2 交互(从绑定事件监听开始)