ReactLearn
01_hello_react
React简介
官网
- 英文官网: React Official
- 中文官网: React 中文文档
介绍描述
React 是一个用于动态构建用户界面的 JavaScript 库。主要的特点有:
- 只关注于视图部分
- 由 Facebook 开源
React的特点
- 声明式编码
- 组件化编码
- 使用 React Native 编写原生应用
- 优秀的Diffing算法,使得React非常高效
为什么React高效
React 之所以高效,主要归功于以下两点:
- 使用虚拟(virtual)DOM,而不是直接操作真实的页面DOM
- 采用DOM Diffing算法,可以最小化页面的重绘
相关JS库
以下是与 React 相关的一些主要的JavaScript库:
- react.js: 这是 React 的核心库
- react-dom.js: 提供操作DOM的React扩展库
- babel.min.js: 可以解析JSX语法代码并转为常规的JS代码
hello_react.html
概括:
- 基本React设置。
- 使用JSX创建一个简单的虚拟DOM,并渲染到页面。
要点:
- 在HTML中创建一个元素作为React应用的“容器”。
- 引入React,ReactDOM和Babel库。
- 使用JSX创建虚拟DOM。
- 使用
ReactDOM.render()渲染虚拟DOM。
1 |
|
02_虚拟DOM的两种创建方式
概括:
- 展示如何使用JSX和纯JS创建虚拟DOM。
要点:
使用JSX创建虚拟DOM:
- 使用JSX(XML-like语法)直接在JavaScript中编写HTML标签。
使用JS创建虚拟DOM:
- 使用
React.createElement()方法。
- 使用
1_使用jsx创建虚拟DOM.html
1 |
|
2_使用js创建虚拟DOM.html
1 |
|
3_虚拟DOM与真实DOM.html
概括:
- 对比虚拟DOM和真实DOM。
要点:
- 虚拟DOM是React用于描述真实DOM的对象。它不是真实的DOM元素,而是对其的轻量级表示。
- 真实DOM是浏览器中的实际元素。
关于虚拟DOM:
- 本质是Object类型的对象(一般对象)
- 虚拟DOM比较“轻”,真实DOM比较“重”,因为虚拟DOM是React内部在用,无需真实DOM上那么多的属性。
- 虚拟DOM最终会被React转化为真实DOM,呈现在页面上。
1 |
|
03_jsx语法规则
jsx语法规则.html
jsx语法规则:
- 定义虚拟DOM时,不要写引号。
- 标签中混入JS表达式时要用{}。
- 样式的类名指定不要用
class,要用className。 - 内联样式,要用
style={{key:value}}的形式去写。 - 只有一个根标签
- 标签必须闭合
- 标签首字母
- 若小写字母开头,则将该标签转为
html中同名元素,若html中无该标签对应的同名元素,则报错。 - 若大写字母开头,
`react就去渲染对应的组件,若组件没有定义,则报错。
- 若小写字母开头,则将该标签转为
1 |
|
04_jsx的小练习
jsx小练习.html
注意:
请确保你能够区分JS语句(代码)与JS表达式。
表达式:表达式会产生一个值,可以放在任何需要值的地方。例如:
aa+bdemo(1)arr.map()function test () {}语句(代码):语句或代码是执行某种操作但不 necessarily 返回值的指令。例如:
if(){}for(){}switch(){ case: xxxx }
1 |
|
05_react中定义组件
1_函数式组件.html
1 |
|
2_类式组件.html
1 |
|
06_组件实例三大属性1_state
理解:
- state是组件对象最重要的属性, 值是对象(可以包含多个key-value的组合)。
- 组件被称为”状态机”, 通过更新组件的state来更新对应的页面显示(重新渲染组件)。
建议:
- 组件中render方法中的this为组件实例对象。
- 组件自定义的方法中this为undefined,如何解决?
- 强制绑定this: 通过函数对象的
bind()。 - 使用箭头函数。
- 强制绑定this: 通过函数对象的
- 状态数据,不能直接修改或更新。
1_state.html
1 |
|
2_state的简写方式.html
1 |
|
07_组件实例三大属性2_props
理解:
- 每个组件对象都会有
props(properties的简写)属性。 - 组件标签的所有属性都保存在props中。
作用:
- 通过标签属性从组件外向组件内传递变化的数据。
- 注意: 组件内部不要修改props数据。
1_props基本使用.html
1 |
|
2_对props进行限制.html
1 |
|
3_props的简写方式.html
1 |
|
4_函数组件使用props.html
1 |
|
08_组件实例三大属性3_refs
理解:
- 组件内的标签可以定义ref属性来标识自己。
ref编码的三种形式:
- 字符串形式的ref:
1
<input ref="input1"/>
- 回调形式的ref:
1
<input ref={(c)=>{this.input1 = c}}/>
- 使用createRef创建ref容器:
1
2myRef = React.createRef()
<input ref={this.myRef}/>
事件处理:
- 通过
onXxx属性指定事件处理函数(注意大小写):- React使用的是自定义(合成)事件, 而不是原生DOM事件。
- React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)。
- 通过
event.target得到发生事件的DOM元素对象。
1_字符串形式的ref.html
1 |
|
2_回调函数形式的ref.html
1 |
|
3_回调ref中回调执行次数的问题.html
1 |
|
4_createRef的使用.html
1 |
|
09_react中的事件处理
事件处理.html
1 |
|
10_react中收集表单数据
1_非受控组件.html
1 |
|
2_受控组件.html
1 |
|
11高阶函数函数柯里化
高阶函数
高阶函数是满足以下两个条件中的任何一个的函数:
- 如果一个函数接收的参数是一个函数,那么该函数就是高阶函数。
- 如果一个函数的返回值是一个函数,那么该函数就是高阶函数。
常见的高阶函数有:Promise、setTimeout、arr.map() 等。
函数的柯里化
函数柯里化是通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式。例如:
1 | function sum(a){ |
1高阶函数函数柯里化.html
1 |
|
2_不用函数柯里化的实现.html
1 |
|
12_组件的生命周期
理解:
- 组件从创建到死亡它会经历一些特定的阶段。
- React组件中包含一系列勾子函数(生命周期回调函数), 会在特定的时刻调用。
- 我们在定义组件时,会在特定的生命周期回调函数中,做特定的工作。
1_引出生命周期.html
1 |
|
2_react生命周期(旧).html
React组件生命周期阶段及其钩子函数:
初始化阶段: 由ReactDOM.render()触发——初次渲染
constructor()componentWillMount()render()componentDidMount()—— 常用
一般在这个钩子中做一些初始化的事,例如:开启定时器、发送网络请求、订阅消息。
更新阶段: 由组件内部
this.setState()或父组件render触发shouldComponentUpdate()componentWillUpdate()render()—— 必须使用的一个componentDidUpdate()
卸载组件: 由ReactDOM.unmountComponentAtNode()触发
componentWillUnmount()—— 常用
一般在这个钩子中做一些收尾的事,例如:关闭定时器、取消订阅消息。
1 |
|
3_react生命周期(新)
React组件生命周期阶段及其钩子函数:
初始化阶段: 由
ReactDOM.render()触发——初次渲染constructor()getDerivedStateFromPropsrender()componentDidMount()—— 常用
一般在这个钩子中做一些初始化的事,例如:开启定时器、发送网络请求、订阅消息。
更新阶段: 由组件内部
this.setState()或父组件重新render触发getDerivedStateFromPropsshouldComponentUpdate()render()getSnapshotBeforeUpdate()componentDidUpdate()
卸载组件: 由
ReactDOM.unmountComponentAtNode()触发componentWillUnmount()—— 常用
一般在这个钩子中做一些收尾的事,例如:关闭定时器、取消订阅消息。
重要的钩子:
render():初始化渲染或更新渲染调用。componentDidMount():开启监听, 发送ajax请求。componentWillUnmount():做一些收尾工作, 如: 清理定时器。
即将废弃的钩子:
componentWillMountcomponentWillReceivePropscomponentWillUpdate
注意: 当前版本使用上述废弃钩子会出现警告,下一个大版本中需要加上UNSAFE_前缀才能使用,未来可能会被彻底废弃,因此不建议使用。
1 |
|
4_getSnapshotBeforeUpdate的使用场景
1 |
|
13_DOM的Diffing算法
1_验证Diffing算法.html
原理图
1 |
|
2_key的作用.html
经典面试题:
- 在React/Vue中,
key有什么作用?key的内部原理是什么? - 为什么遍历列表时,
key最好不要用index?
答案:
虚拟DOM中
key的作用:简述:
key是虚拟DOM对象的标识。在更新显示时,key发挥着至关重要的作用。详细解析:
当组件的状态中的数据发生变化时,React会根据这些新数据生成新的虚拟DOM。之后,React会进行新的虚拟DOM与旧的虚拟DOM的diff比较。比较规则如下:a. 如果在旧虚拟DOM中找到了与新虚拟DOM相同的
key:- 若虚拟DOM中内容没有变化, 则直接复用之前的真实DOM。
- 若虚拟DOM中内容发生了变化, 则生成新的真实DOM,并替换掉页面中原来的真实DOM。
b. 如果在旧虚拟DOM中未找到与新虚拟DOM相同的
key:- 基于新数据创建新的真实DOM,并渲染到页面。
用
index作为key可能会引发的问题:如果数据进行逆序添加、逆序删除或其他破坏顺序的操作,会导致不必要的真实DOM更新。这意味着虽然最终的界面显示效果是正确的,但效率会降低。
如果DOM结构中包含输入类的元素,使用
index作为key可能会导致错误的DOM更新,进而引发界面上的问题。注意: 如果数据列表仅用于展示,并且可以确保没有逆序添加或删除等破坏顺序的操作,使用
index作为key是可行的。
开发中如何选择
key?- 尽量使用每条数据的唯一标识作为
key,例如id、手机号、身份证号、学号等。 - 如果确定只是简单的展示数据,用
index也是可以的。
- 尽量使用每条数据的唯一标识作为
1 |
|
复习
1_类的基本知识.html
总结:
- 类中的构造器不是必须要写的,要对实例进行一些初始化的操作,如添加指定属性时才写。
- 如果A类继承了B类,且A类中写了构造器,那么A类构造器中的super是必须要调用的。
- 类中所定义的方法,都放在了类的原型对象上,供实例去使用。
1 |
|
2_原生事件绑定.html
1 |
|
3_类方法中的this指向.html
1 |
|
4_展开运算符.html
1 |
|
5_对象相关的知识.html
1 |
|
6_演示函数的柯里化.html
1 |
|






