(PPT来源:尚硅谷)
基础概念
![在这里插入图片描述](https://img-blog.csdnimg.cn/69e37311f3644497a63fa39719965458.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/a1f0cd49748644809030133a49932d01.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/499762a52df7485d871cf935a5ee1c50.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/10892fee90ed424494055fad8d43bb43.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) (第三点 eg: 进行虚拟DOM比较) ![在这里插入图片描述](https://img-blog.csdnimg.cn/9bf111f3108a43b9be0aad6b4ff9f2df.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/578e2993eb224755b07339bfcd57b7e1.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/5310a3ea652e4bd78a4533ed7d79afd6.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70)
入门
![在这里插入图片描述](https://img-blog.csdnimg.cn/7e6bb73b0fcc4289877f96a7960196d8.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/c570dd5df8a8403b97f1ac8c87122954.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/e0ed94fef8494db586d8aca2f1c8d1ee.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70)
依赖包与Hello React
![在这里插入图片描述](https://img-blog.csdnimg.cn/1ccee466f3b74ed082a1d4b74c0beed1.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/0622930fcec743a1aaa5b996e0350539.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) 引入包:蓝色的核心库要在红色的核心库之前引入 ![在这里插入图片描述](https://img-blog.csdnimg.cn/0ce9163c00aa453aa6252cd05f6a09de.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) 直接利用 jsx 创建了虚拟 DOM 书写注意事项: babel… ![在这里插入图片描述](https://img-blog.csdnimg.cn/ed8eccdeb816421e91f494b0b8a1fdb2.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70)
虚拟DOM的两种创建方式
1. 使用 jsx 创建
代码: ![在这里插入图片描述](https://img-blog.csdnimg.cn/43750f81a1b84ca89fc6af1882e77ea7.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70)
2. 使用原始 js 创建
(不再需要 babel 将 jsx 转换为 js;type 还原为 javascript;用原始 js 创建虚拟DOM) (过于复杂) ![在这里插入图片描述](https://img-blog.csdnimg.cn/4bb437e694cb4c71a2d72074265d2b00.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/d5ae985a531a4aefae20677c4fffa9a5.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/aaf74d5f69f84b61ace23a7060ee1d8a.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70)
jsx 语法规则
- 静态页面代码:
![在这里插入图片描述](https://img-blog.csdnimg.cn/3116e6d0c6a04175a25ee3d450ed7394.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) - 动态化代码:
![在这里插入图片描述](https://img-blog.csdnimg.cn/98636daa63ee455e9c32aa7507a3a932.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70)
模块与组件
![在这里插入图片描述](https://img-blog.csdnimg.cn/6f74ace6e876499c8038f8a67a961673.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70)
- 拆模块:拆 js 文件,就是拆模块
拆组件:拆分更加细致 (eg:针对一个头部拆分为 html结构、css样式、js交互、img图片、video音视频…) ![在这里插入图片描述](https://img-blog.csdnimg.cn/d5db34a9a0e94e29887eae707ed19045.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) - 谷歌插件:开发者重的插件安装
![在这里插入图片描述](https://img-blog.csdnimg.cn/1a7d8dadd2fc4027b3e22cac3f65f62d.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70)
面向组件编程
1. 函数式组件
![在这里插入图片描述](https://img-blog.csdnimg.cn/4906dc06f3324b31bba65a1e4cf4e540.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70)
- 代码(写一个方法作为组件)
(首字母大写;组件需要写为标签形式) ![在这里插入图片描述](https://img-blog.csdnimg.cn/ab6ae9262aae4dde9fc8c4ab56547596.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) ES5 中的严格模式:禁止自定义函数里的 this 指向 window,其 this 为 undefined (babel 翻译后开启了严格模式) (babel 是一个 JavaScript 编译器) ![在这里插入图片描述](https://img-blog.csdnimg.cn/ebe7ae46412745209da955e28e150107.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) 其中 react 的工作流程: ![在这里插入图片描述](https://img-blog.csdnimg.cn/32a00e302f1b4ba4b842fc01398b09bf.png)
2. 类式组件
- 类的复习
![在这里插入图片描述](https://img-blog.csdnimg.cn/c9cf6dd2861f4571af258019ead2cb28.png) 方法中调用方法,需要用 this 指明调用的实例对象,即在内方法前加 this ![在这里插入图片描述](https://img-blog.csdnimg.cn/e99510c586cc4835a2f7075c1cffb682.png) 类中的 this: 构造器中的 this 一定是实例对象 render 里的 this 也是组件实例对象 函数式组件里的 this 为 undefined(严格模式:禁止自定义的 this 指向 window) ![在这里插入图片描述](https://img-blog.csdnimg.cn/8bf696c0e758492496a5e1b04b523063.png) - 代码(写一个类作为组件):
渲染中的类需要写成标签形式,由 react new出一个实例 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9d7e2975f1b0466fb148f5344994c049.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/8faf07eb1bb2475884bbc11f6ee645b6.png)
- 简单组件 & 复杂组件
简单组件:无state 复杂组件:有state
类式组件的三大核心属性
![在这里插入图片描述](https://img-blog.csdnimg.cn/e6a943345a234d0da92c97f7bae5cc3b.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70)
1. state
![在这里插入图片描述](https://img-blog.csdnimg.cn/f416b307362a4593bc72697d68fd15a4.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70)
- 点击事件的写法:
前两种为原生写法,第三种为 react 便捷写法 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d92ad8e883ca40b38b2d93b5b2cea52b.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) - 解决类中 this 的指向问题
不解决时:onClick 点击事件直接调用的是这个函数,并不是从实例出发去调用的 而类中写的方法,多半都是给事件作为回调使用的 bind:生成新的函数、更改函数里 this 指向 undefined 的问题 (这句 使得 实例对象自身多了该方法) ![在这里插入图片描述](https://img-blog.csdnimg.cn/eab34b94cf1745fdaa4c1d718e38a24d.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) - 写入状态:state 写成一个对象形式 state { }
修改状态:要用到内置 API setState ![在这里插入图片描述](https://img-blog.csdnimg.cn/8cc06daf68b744e18658e0c365c13b24.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) 精简之后: (1)构造器去除(state{ } 直接写在类中) (2)更改 this 指向的方法简写:赋值语句 + 箭头函数 (箭头函数没有自己的 this,其函数中有 this 时会找外侧函数的 this 使用) ![在这里插入图片描述](https://img-blog.csdnimg.cn/9ff1bd66d12649bc97920b78c7d945cc.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70)
2. props
传递 props = 传递标签属性 ![在这里插入图片描述](https://img-blog.csdnimg.cn/59552ad7b82e417fbcf5e4d87871eb72.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70)
- 代码
普通写法 批量传值 ![在这里插入图片描述](https://img-blog.csdnimg.cn/975b5ba2b56d45efabac7b3603637d96.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) 重点: …三点运算符: (1)展开数组(原生语法不可,react + babel 可以展开一个对象且仅适用于标签属性的传递) (2)连接数组 (3)不确定传参数量时可用 (4)使用{…xxx}可以复制一个对象 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5c4c2a2839784b63b39821f4574f11c6.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) - 对 props 进行限制
类型限制、必要性限制、指定默认值 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5049d675beb649029025912f6e569124.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) - 简写
(props 是只读的,不允许直接更改 props) 对标签属性的限制、修改全部放于类中,赋予 static 关键字 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5ee27ad57dcb46d29e9e940d8177c0d4.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70)
2.1 类式组件的 构造器 & props
- 在类中通过实例访问props
![在这里插入图片描述](https://img-blog.csdnimg.cn/f8dcb01ca7784861a7d69eaae9038991.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) 构造器的2个作用: ![在这里插入图片描述](https://img-blog.csdnimg.cn/5e86d83697f94895a1d2785b9edc52f0.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/e9d8977c90d945acaf03b221aa34aee3.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM1MTQ3MA==,size_16,color_FFFFFF,t_70) 综上,构造器能省略则省略
2.2 函数式组件 props
函数式组件没有自己的实例this,所以没有state(hooks中才可以)、refs属性 但是由于能够传入参数,所以可以使用 props ![在这里插入图片描述](https://img-blog.csdnimg.cn/2f95ecf60de644f99106f21f47b1ac57.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6LiP6Iqx5b2S5Y676ams6LmE6aaZ,size_20,color_FFFFFF,t_70,g_se,x_16) 属性的限制、默认等,可以通过 . 写在外侧 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8eb3425142db4bf78b603b1f9a6e04e1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6LiP6Iqx5b2S5Y676ams6LmE6aaZ,size_20,color_FFFFFF,t_70,g_se,x_16)
props 总结
标签属性收集在props中,可以使用…批量传递 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b3a04257207848f4a8c22eafa6234a41.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6LiP6Iqx5b2S5Y676ams6LmE6aaZ,size_20,color_FFFFFF,t_70,g_se,x_16) 可以对标签属性进行限制:.propTypes、defaultProps ![在这里插入图片描述](https://img-blog.csdnimg.cn/b0b1d46fac6b4fb89056e72466f9694f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6LiP6Iqx5b2S5Y676ams6LmE6aaZ,size_17,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/d6255629d2b045c2b5e2d6593a221ff6.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6LiP6Iqx5b2S5Y676ams6LmE6aaZ,size_18,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/a30451c211654f50b000e5c8aa71a415.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6LiP6Iqx5b2S5Y676ams6LmE6aaZ,size_17,color_FFFFFF,t_70,g_se,x_16) (构造器一般都可以省略)
3. refs & 事件处理
3.1 字符串形式的 ref
![在这里插入图片描述](https://img-blog.csdnimg.cn/3600c6c671eb4f6d8736a718f9a7530e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6LiP6Iqx5b2S5Y676ams6LmE6aaZ,size_20,color_FFFFFF,t_70,g_se,x_16) ref的键值对:ref的值 – ref 所处节点 refs中收集到的ref:页面真实DOM的节点(虚拟DOM转换之后) ![在这里插入图片描述](https://img-blog.csdnimg.cn/14551a4ff6494c159da61fc263f44f54.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6LiP6Iqx5b2S5Y676ams6LmE6aaZ,size_20,color_FFFFFF,t_70,g_se,x_16)
3.2 回调形式的refs
- 字符串形式 refs 不太推荐,存在效率不高的问题:
![在这里插入图片描述](https://img-blog.csdnimg.cn/193dee9c3d714b848e8f2a1501e08682.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6LiP6Iqx5b2S5Y676ams6LmE6aaZ,size_20,color_FFFFFF,t_70,g_se,x_16) - 目前,Reac官网推荐写法:回调形式
(ref 内直接定义一个函数,不需要自己调用,最终自动实现) ![在这里插入图片描述](https://img-blog.csdnimg.cn/ce59a03110ad4f76a925e1bad546a038.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6LiP6Iqx5b2S5Y676ams6LmE6aaZ,size_20,color_FFFFFF,t_70,g_se,x_16) ref 的参数:ref 当前所处的节点; 把a节点放在了组件实例自身上,并取名为 input1 (箭头函数没有自己的 this,于是向外找,render 的 this 是组件实例对象) (于是,将 ref 当前所处的节点挂在了实例自身上,并取名为 input1) (见名知意,将随意的 a 改名为 currentNode,最终由 c 表示) ![在这里插入图片描述](https://img-blog.csdnimg.cn/37245ab99c0749e1b3ed1dcb345d9c3d.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/0de2ac21b49f4fe5ac2f4a63c88aff73.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/3c30b3afc9d74a49b55ad98691b7338a.png) 最终的实现: ![在这里插入图片描述](https://img-blog.csdnimg.cn/5521d47f15614361a9a803fe26d98f50.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6LiP6Iqx5b2S5Y676ams6LmE6aaZ,size_20,color_FFFFFF,t_70,g_se,x_16) - 回调次数的问题
更新过程中:清空 + 传入节点 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f14e40e65bd8402488d23b96686b710e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6LiP6Iqx5b2S5Y676ams6LmE6aaZ,size_20,color_FFFFFF,t_70,g_se,x_16) PS:JSX的注释 ![在这里插入图片描述](https://img-blog.csdnimg.cn/ad44322cc79a444ca4cb03c3a7d1f00a.png) 问题的解决:定义为 class 绑定函数(将函数放在了实例自身) ![在这里插入图片描述](https://img-blog.csdnimg.cn/d36cb70dc9aa4a729ec252835272786a.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/a2ca0dc090aa46ba9b3b87970a91d9a5.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6LiP6Iqx5b2S5Y676ams6LmE6aaZ,size_10,color_FFFFFF,t_70,g_se,x_16)
3.3 createRef
![在这里插入图片描述](https://img-blog.csdnimg.cn/ba7031e8b71e414281c8d38263e42408.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6LiP6Iqx5b2S5Y676ams6LmE6aaZ,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/81aca8c8c26b4ae189544ad047054d81.png) 缺点:专人专用,需要很多 React.createRef()
|