函数式组件与类式组件的区别
总结如下:
1、在异步更新时:
- 类组件有 this,可以通过 this.state.value 指向最新的值,不想指向最新的值可以使用闭包的办法。
- 函数组件没有this,捕获了渲染时(例如点击时)所使用的值,可以通过 useRef 来拿到最新的值
2、在使用 hooks 时:
- 在处理类似于 intervals 和 subscriptions 这样的
命令式API
时,ref 会十分便利。可以用 ref 跟踪任何值 —— 一个prop,一个state变量,整个props对象,或者甚至一个函数。然后可以使用 useCallback 来优化,reducer 可能是更好的选择。 - 要记得使用 useEffect、useCallback。还要了解 useReduce 和 useCallback 之间的区别,以更好的选择他们。
- 使用了很多函数组件之后,要记得优化代码和了解什么值会随着时间而改变
3、hooks 的心法:
“写代码时要认为任何值都可以随时更改”。
React的优化
...this.props
不要滥用,请只传递component需要的props,传得太多,或者层次传得太深,都会加重shouldComponentUpdate里面的数据比较负担。
方法绑定的使用
- 方法直接绑定在dom节点中
<div onClick={this.tap.bind(this)} />
- 方法绑定放在constructor中
constructor(props) {
super(props);
this.tap= this.tap.bind(this);
}
- 箭头函数
tap = ()=>{};
<div onClick={this.tap} />
tap =(value)=> {};
<div onClik={()=>this.tap(value)} />
总结:
1.由于绑定是在render中执行,而render是会执行多次的,每次bind和箭头函数都会产生一个新的函数,因而带来了额外的开销
2.使用构造器bind的方法,每个实例都可以有效地共享函数体,从而更加有效的使用内存。但当要绑定的函数较多时,这种方法又显得相对的枯燥和无聊。所以,在知道实例不多,函数体不大的前提下,使用箭头函数更加快捷。
3.综合三种写法,第三种是目前最优写法
数组遍历map
map里面添加key,并且key不要使用index(可变的),尽量使用稳定常量作为key。使用index作为key,只是会让代码不报错,其他一无是处。
每当组件的props或state改变时, React会重新创建一个virtual DOM, 与上一个作对比, 如果发现两个virtual DOM不完全相同, 则React就会做reconcile, 把有差异的地方更新到真实的DOM上。
使用常量作为key
尽量少用不可控的refs、DOM操作。
props和state的数据尽可能简单明了,扁平化。便于数据对比,数组遍历从而减小带来的性能消耗。
使用return null而不是CSS的 display:none
来控制节点的显示隐藏。保证同一时间页面的DOM节点尽可能的少。
注意可重构的代码,组件化
- 组件分类
- 可复用性
- 足够细
- 耦合度低
promise 同时三个请求
场景:需要请求多个接口获取数据后,才能进行其他操作。比如说一个页面上需要等两个或多个ajax的数据回来以后才正常显示,在此之前只显示loading图标。
(1)Promise.all 可以将多个 Promise 实例包装成一个新的Promise实例。同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值,只要有一个失败都是返回失败结果。
(2)Promise.all 获得的成功结果的数组里面的数据顺序和 Promise.all 接收到的数组顺序是一致的,即p1在前,即便p1的结果获取的比p2要晚。p1的返回数据也会在p2前面。这带来了一个绝大的好处:在前端开发请求数据的过程中,偶尔会遇到发送多个请求并根据请求顺序获取和使用数据的场景。
HTTP1 HTTP2
新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能。
请求头里加什么做到缓存效果
const options = {
storage: true, // 是否开启loclastorage缓存
storageKey: 'apiCache',
storage_expire: 600000, // localStorage 数据存储时间10min(刷新页面判断是否清除)
expire: 20000 // 每个接口数据缓存ms 数
};
webpack 打包原理
webpack根据 webpack.config.js
中的入口文件,在入口文件里识别模块依赖,不管这里的模块依赖是用CommonJS写的,还是ES6 Module规范写的,webpack会自动进行分析,并通过转换、编译代码,打包成最终的文件。最终文件中的模块实现是基于webpack自己实现的webpack_require(es5代码)
,所以打包后的文件可以跑在浏览器上。
React父子组件的传递
react的数据流是单向的,最常见的就是通过props由父组件向子组件传值。
接下来我们反过来,让子组件向父组件通信。 子组件向父组件通信的基本思路是,父组件向子组件传一个函数,然后通过这个函数的回调,拿到子组件传过来的值。
发布者与订阅者模式
兄弟间组件通信,一般的思路就是找一个相同的父组件,这时候既可以用props传递数据,也可以用context的方式来传递数据。 当然也可以用一些全局的机制去实现通信,比如redux等。
懒加载的原理
一张图片就是一个标签,浏览器是否发起请求图片是根据图片的src属性,所以实现懒加载的关键就是,在图片没有进入可视区域时,先不给图片的src赋值,这样浏览器就不会发送请求了,等到图片进入可视区域再给图片的src赋值。
评论(1)
写的不错 点个赞