React拖拽组件Dragact V0.1.7:教你优化React组件性能与手感
仓库地址:Dragact手感丝滑的拖拽布局组件
预览地址:支持手机端噢~
上回我们说到,Dragact组件已经进行了一系列的性能优化,然而面对大量数据的时候,依旧比较吃力,让我们来看看,优化之前的Dragact。
纵向堆叠着314个方块,插入时明显的卡顿,大约1秒的延迟
同样纵向堆叠着314个方块,插入时卡顿明显减少很多,可以接受
在实际生产过程中,可能不会有那么多物块,就拿我们项目的dashboard来说,整个屏幕最多只有10个方块,就已经是了不起了。
但是强迫症犯了,为了使得性能达到极致,再次进行了深度的优化。
React优化的策略有哪些呢?
策略一: shouldComponentUpdate()
因为React 的diff只是简单的深度优先+刷新策略去diff html tag,所以数据的改变,React是不会知道的。
因此,开发者必须得自己去diff数据,shouldComponentUpdate就是用来diff数据的一个特殊声明周期函数。
具体的,请看我之前的回答和徐飞叔的回答:
方正:Vue为什么没有shouldComponentUpdate的生命周期?
徐飞:Vue为什么没有shouldComponentUpdate的生命周期?
策略二:用记忆功能函数去缓存大量计算结果
有很多情况下,我们的遍历是不可避免的。
React中最著名性能问题,就是selector问题,现在大家也都知道用reselect去做性能优化了,但是本质呢?
我们写一点伪代码来做演示:
//首先,我们有一个斐波那契生成函数 fib();
//用户想用的时候,就会去掉这个函数
const number = fib();
//我们知道,fib()函数里面会经过大量的计算,才得出我们想要的结果
//但是,除了第一次计算之外,之后的所有计算都是不需要的,因为我们已经在一开始拿到结果了
//怎么做最好呢?闭包;
const Fib = function (){
var cache = void 666;
return function(){
if(!cache){
cache = fib();
return cache;
}
return cache;
}
}();
//当用户调用Fib的时候,只会在第一次进行计算,之后的后只会从cache中拿出来。
不要小看这种优化,很多时候,我们大量重复的遍历就会导致性能的低下。
策略三:减少dom的深度
我们都知道,每次react 更新的时候,都会进行diff,深度越大,diff的层次越多。
减少diff的层次是非常重要的性能优化手段,尤其是数据量巨大的时候。
具体怎么去减少dom的深度,方法有很多,我用的方法是:render children的办法。
简单的举个例子,拖拽组件:
<Dragger>
<div>我是拖拽的组件</div>
</Dragger>
这样的一个设计,看似很简单,很明了。用Dragger组件去包囊我们想要的组件,就可以让其获得拖拽的属性。
这么做不是不行,但是很多时候我们在设计之初,没考虑那么多,就会使用这样一种方式去设计:
class Dragger extends Component{
moving(){}......
render(){
return (<div
onMouseDown={...}
onTouchDown={...}
style={....}
>
{this.props.children}
</div>)
}
}
是不是很常见?这么做的问题其实很明显,就是无缘无故的,我们多了一层div,组件一多,那么就多会了几层div,无疑造成了渲染压力。
使用render children,我们可以这么设计
class Dragger extends Component{
moving(){}......
render(){
const provided = {
onMouseDown:this.onMouseDown
onTouchDown:this.onTouchDown
style:{....}
}
return this.props.children(provided);
}
}
在外部使用的时候,就变成了:
<Dragger>
{(provided)=><div {...provided}>我是拖拽的组件</div>}
</Dragger>
看似稍微蛋疼了一些,但是好处就是:减少了dom的层级。
还有更多好处,可以看之前的一篇文章:React组件:拖拽布局Dragact v0.1.6 发布
手感的优化
看似很标准,实际上用户需要拖动很远,才会物体进行交换
看似很标准,实际上用户需要拖动很远,才会物体进行交换,造成这样让人不适的感觉原因是因为计算时,我取的计算中心永远是物体的顶边。
所以,当物体向下滑动的时候,必须要物体的顶边到达下一个物块的中心才能发生交换。
上图我们可以看到,长条的物块,已经拖出了屏幕很远,才会进行交换。
就这一点点差异,让我顿时感到不爽!
为了使得手感更加优异,做了大量实验以后,我发现,把移动中心设置在物体的重力中心,最为舒适。
把移动中心设置在物体的重力中心,最为舒适。
这一点点设计的改变,使得手感完全不同了。
你可以狠狠的点击:预览地址
到此,Dragact组件,无论从性能,还是手感上来说,都已经相当的符合我们的需求了。
yeah~
各位,我们下次见。
React拖拽组件Dragact V0.1.7:教你优化React组件性能与手感的更多相关文章
- React组件:拖拽布局Dragact v0.1.6 发布
仓库地址:Dragact爽滑的拖拽组件 大家好,新年已经过去,大家又投入了繁忙的工作当中,由于我在国外,因此压根儿没有休息... 少说废话,上周一周的时间里,我陆陆续续的为Dragact组件进行了一系 ...
- react 拖拽排序---原生
定义css, 两个动画 .drag-up { -webkit-animation: dragup ease 0.2s 1; animation: dragup ease 0.2s 1; -webkit ...
- react拖拽(表格拖拽排序、普通拖拽排序以及树形拖拽排序)
表格拖拽排序:组件地址:https://reactabular.js.org/#/drag-and-drop 拖动的排序是用React-DnD:React-DnD:http://react-dnd.g ...
- 再谈React.js实现原生js拖拽效果
前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...
- React Editor 应用编辑器(1) - 拖拽功能剖析
这是可视化编辑器 Gaea-Editor 的第一篇连载分析文章,希望我能在有限的篇幅讲清楚制作这个网页编辑器的动机,以及可能带来的美好使用前景(画大饼).它会具有如下几个特征: 运行在网页 文档流布局 ...
- React造轮子:拖拽排序组件「Dragact」
先来一张图看看: 项目地址:Github地址 (无耻求星!) 在线观看(第一次加载需要等几秒):预览地址 说起来不容易,人在国外没有过年一说,但是毕竟也是中国年,虽然不放假,但是家里总会主内一顿丰盛的 ...
- 强大的拖拽组件:React DnD 的使用
强大的拖拽组件:React DnD 的使用 react.js 10.6k 次阅读 · 读完需要 25 分钟 17 文章首发我的个人blog : 原文链接 学习 React DnD 的最初原因是阅读 ...
- 实现拖拽复制和可排序的react.js组件
在实现复制前,对之前的拖拽排序组件属性进行了修改. 摒弃了value中的content属性,拖拽组件暴露的render函数,利用这个属性进行组件内部子组件的渲染,这点主要是参考了蚂蚁金服的Ant de ...
- React.js实现原生js拖拽效果及思考
一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...
随机推荐
- μC/OS-II中使用软件定时器
在试着将μC/OS-II移植到ARM7芯片(LPC2138)上的过程中,发现使用OSTmrCreate创建的OSTmr始终都不能执行CallbackFunction,OS版本是v2.85,最后是这么解 ...
- EMD——EEMD——CEEMD语音增强算法基础
首先,HHT中用到的EMD详细介绍:https://wenku.baidu.com/view/3bba7029b4daa58da0114a9a.html 本文具体参考 https://zhuanlan ...
- VBE2014_Setup_20160709.rar
VBE2014用于各种VBA编程环境的插件,包括VB6 安装本软件之后,在编程环境的“外接程序管理器”中,可以勾选/取消勾选. 在代码区域点击右键,可以对 过程.模块.工程级别的代码进行自动缩进. * ...
- 依赖注入&控制反转
IoC——Inversion of Control 控制反转DI——Dependency Injection 依赖注入 要想理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁? 依赖:谁依 ...
- 由情感计算带来的惊喜发现——记Rosalind W. PICARD“21世纪的计算”大会主题演讲
W. PICARD"21世纪的计算"大会主题演讲" title="由情感计算带来的惊喜发现--记Rosalind W. PICARD"21世纪的计算& ...
- LeetCode Day 3
LeetCode0003 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 & ...
- Redis学习之热点key重建
在Redis的生产环境中,大量客户端连接请求某一个key,但都需要从DB中获取数据,来回写数据库,如下图: <ignore_js_op> 造成的问题: 大量的线程请求数据库,造成数据库压力 ...
- 密码子演化假说|凝固事件假说|立体化学假说|共进化假说|代谢途径相关性假说|四重兼并|假四重兼并|最小损伤原则|AU-rich|GC-rich|逐步进化假说|分子机制进化假说
生命组学 将密码子表重排后发现,嘌呤嘧啶含量不同,密码子的氨基酸种类由第一二位决定,同时第三位变化大却没有蛋白质层面上实质性的改变,这说明第三位氨基酸是用于维持氨基酸组成不发生变化同时保证蛋白质稳定性 ...
- mongo的基本命令操作
基本用法学习:https://www.runoob.com/mongodb/mongodb-create-database.html MongoDB数据库基本用法 show dbs:显示数据库列表 s ...
- 一次面试留下的实际应用问题。关于HttpModule,IIS集成模式。
资料来自<IIS7开发与管理完全手册> 周五面试时有点紧张,没能静下心思考,当时隐约想到这个解决方案,但因面试环境和心态确未能明确的表述. 回家的地铁上已经找到解决办法. 要点:1基于IH ...