当前位置: 首页 > Web前端 > HTML5

React拖拽组件Dragact V0.1.7:教你优化React组件性能与手感

时间:2023-04-05 14:03:54 HTML5

React拖拽式组件DragactV0.1.7:手把手教你优化React组件的性能和手感做了一系列的性能优化,但是面对海量数据还是有难度。让我们看看之前的Dragact的优化。有314个方格垂直堆叠,插入时有明显滞后。1秒左右的延迟也垂直堆叠了314个方格,插入时的卡顿明显减少。实际制作过程中可能没有那么多对象,这是可以接受的。Blocks,以我们项目的dashboard为例,整个屏幕最多只有10个block,已经很了不起了。但是强迫症犯了,为了把性能做到极致,再次深度优化。React优化的策略是什么?策略一:shouldComponentUpdate()因为React的diff只是简单的深度优先+刷新策略diffhtml标签,所以React不会知道数据的变化。因此,开发者不得不自己去diff数据,而shouldComponentUpdate就是一个专门用于diff数据的生命周期函数。具体请看我之前的回答和徐飞大叔的回答:方正:Vue为什么没有shouldComponentUpdate的生命周期?徐飞:为什么Vue没有shouldComponentUpdate生命周期?策略二:利用内存功能缓存大量的计算结果很多时候,我们的遍历是不可避免的。React中最著名的性能问题是选择器问题。现在大家都知道reselect是用来做性能优化的,但是本质呢?下面写一段伪代码来演示一下://首先,我们有一个斐波那契生成函数fib();//当用户要使用它的时候,这个函数就会被去掉constnumber=fib();//我们知道,fib()函数会经过大量的计算得到我们想要的结果//但是,除了第一次计算之外,后面的所有计算都是不必要的,因为我们一开始就已经得到了它的计算结果。//最好的方法是什么?Closure;constFib=function(){varcache=void666;returnfunction(){if(!cache){cache=fib();返回缓存;}返回缓存;}}();//当用户调用Fib时,只会计算第一次,后面的只会从缓存中取出。不要小看这种优化。很多时候,我们的反复遍历会导致性能低下。策略三:降低dom的深度我们都知道react每次更新都会进行diff。深度越大,差异层越多。降低diff级别是一个非常重要的性能优化手段,尤其是在数据量巨大的时候。具体怎么降低dom的深度,有很多方法,我用的方法是:renderchildren的方法。举个简单的例子,一个拖拽组件:

我是一个拖拽组件
这样的设计看起来非常简单明了。使用Dragger组件来封装我们想要的组件,使其能够获取dragging属性。这样做也不是不可以,但是很多时候我们在设计之初并没有想那么多,所以我们这样设计:classDraggerextendsComponent{moving(){}......render(){return({this.props.children}
)}}这常见吗?这样做的问题其实很明显,就是我们无缘无故多了一层div,如果组件多了,那么div就多了几层,这无疑会造成渲染压力。使用renderchildren,我们可以设计classDraggerextendsComponent{moving(){}......render(){constprovided={onMouseDown:this.onMouseDownonTouchDown:this.onTouchDownstyle:{....}}返回this.props.children(已提供);}}外部使用时变成:{(provided)=>我是一个拖动组件
}好像有点蛋疼,但是优点是降低了dom的层级。还有更多的好处,可以看之前的一篇文章:React组件:拖放布局Dragactv0.1.6发布手感的优化看似很标准,其实用户需要拖远才能交换对象。标准,实际上用户需要拖很远才能交换对象。之所以有这种不舒服的感觉,是因为在计算的时候,我取的计算中心始终是物体的上边缘。因此,当物体向下滑动时,物体的上边缘必须到达下一个方块的中心才能交换。在上图中,我们可以看到长块在交换之前已被拖出屏幕很远。就是这一点差别,让我顿时觉得不自在!为了让手感更好,我做了很多实验,发现把运动中心设置在物体的重心是最舒服的。将运动中心设置在物体的重心是最舒服的。这个小小的设计变化给人一种完全不同的感觉。大家可以猛戳一下:预览地址在这里,Dragact组件无论是性能还是手感,都已经很满足我们的需求了。yeah~大家下次见。