slickgrid.js 一种高性能web数据表格组件的探讨

广告位招租
扫码页面底部二维码联系

本文将探讨一种高性能web数据表格组件的【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。实现,首先简单介绍slickgrid这个未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。前人开发的组件,接着对该组件的设计和实现未经授权,禁止复制转载。【未经授权禁止转载】思路进行讨论,最后对该组件的思想进行提炼【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。,实现基于原始思想的新组件。

【关注微信公众号:wwwtangshua【原创不易,请尊重版权】【作者:唐霜】ngnet】【原创不易,请尊重版权】未经授权,禁止复制转载。【原创内容,转载请注明出处】

slickgird

slickgrid是一款高性能的web数转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。据表格组件,由mleibman于2009【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。年5月提交到github,仓库地址htt【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.netps://github.com/mlei【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。bman/SlickGrid。该组件近几转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。年已经停止开发,最后一次提交是2016年【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】5月,但是之前的提交已经是2014年。虽【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。然组件本身的开发已经停止,但是留下了非常【转载请注明来源】【本文首发于唐霜的博客】丰富的grid组件思想。slickgri著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。d的主要特点如下:

【转载请注明来源】转载请注明出处:www.tangshua【原创内容,转载请注明出处】【原创内容,转载请注明出处】ng.net本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。
  1. 高性能:slickgrid采用了局部渲染转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。的机制,对于整个数据表格而言,真正对用户本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。有用的,是可视区域的表格,因此,slic转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。kgrid只渲染可视区域的表格,从而节省未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。了大量DOM渲染操作,性能上几乎是目前市原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net面上知名grid组件里面最好的。
  2. 【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】【未经授权禁止转载】
  3. DataView:slickgrid里面【转载请注明来源】原创内容,盗版必究。提供了一个DataView的工具,它独立未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net于grid本身,虽然grid本身就可以完未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。成数据的展示,但是为了数据的更多可操作性原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net,DataView提供了更加丰富的操作空本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net间。同时,这一思想把界面操作和数据操作分著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。离开,虽然在现在看来已经非常老套,而且代【本文首发于唐霜的博客】【本文首发于唐霜的博客】码层面也很落后,但是在当初那个时代,还是【转载请注明来源】【作者:唐霜】非常先进的。
  4. 【作者:唐霜】【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。
  5. 语言性:slickgrid并不是完整的U未经授权,禁止复制转载。【原创不易,请尊重版权】I组件,并没有提供直接的接口一次性完成所转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】有配置,它具有语言性,也就是提供基础的语【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】法,你可以用它的语法和素材,不断按照自己【作者:唐霜】著作权归作者所有,禁止商业用途转载。的需要进行组合,如果它内部没有实现,你可【版权所有,侵权必究】【本文受版权保护】以自己另外写一套代码,和它混淆以后使用。著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】总之,它就像一堆积木的块,构建出什么样的【本文首发于唐霜的博客】【原创内容,转载请注明出处】grid功能就看开发者如何利用它提供的块转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。组合起来。
  6. 【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。

当然,这些特点并不全是优点,几乎每一个点原创内容,盗版必究。【本文受版权保护】都有可诟病的地方。不过,这种思想是对技术【作者:唐霜】本文版权归作者所有,未经授权不得转载。的一种提炼,已经非常难能可贵。

【版权所有】唐霜 www.tangshu【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】ang.net【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshua【未经授权禁止转载】【作者:唐霜】ng.net

grid的构成元素

现在,我们从头思考,一个数据表格,它应该【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】由哪些元素构成。数据表单最基本的元素是单【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】元格,也就是cell,是单点数据的展现方【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】式。一个数据节点被存放在一个cell中。未经授权,禁止复制转载。【本文受版权保护】cell的父级是行,也就是row。整个数【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net据表格就是由很多row堆叠而成。row是【作者:唐霜】【未经授权禁止转载】数据展示的主要部分。但是除此之外,还有表【转载请注明来源】【版权所有,侵权必究】头,也就是指示列信息的columns信息【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】,它指明了同一行中,相同索引的cell的本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。共同特征。这些是grid中最为基础的元素【作者:唐霜】【关注微信公众号:wwwtangshuangnet】

【未经授权禁止转载】【本文受版权保护】【原创不易,请尊重版权】【原创不易,请尊重版权】

问题是,就像slickgrid中给人的想【未经授权禁止转载】【作者:唐霜】象一样,我们并没有必要把所有的cell渲转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】染出来,而是只渲染当前可视区域的数据。这本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net种思想基于数据量很大的假设。当然,即使是未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】小数据量,这种设计也是应该兼容的才可以。【原创内容,转载请注明出处】【原创内容,转载请注明出处】因此,我们需要设计一种对可视区域和渲染的【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。抽象概念。这就是viewport和can未经授权,禁止复制转载。【作者:唐霜】vas。

【作者:唐霜】【原创内容,转载请注明出处】【关注微信公众号:wwwtangshua【原创不易,请尊重版权】未经授权,禁止复制转载。ngnet】著作权归作者所有,禁止商业用途转载。

viewport是用于提供给用户的可视区著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】域的视口,就像浏览器视口一样,只提供这么本文作者:唐霜,转载请注明出处。原创内容,盗版必究。大的窗口大小,至于内部网页的实际大小,是转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。无法通过该视口直接观察到的,必须通过滚动【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net条来感知。而对于数据可展开的实际大小,就【作者:唐霜】未经授权,禁止复制转载。是canvas的大小。canvas的意思【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】是画布,也就是说是绘制cells的地方。原创内容,盗版必究。【作者:唐霜】canvas的实际大小应该是假设所有数据【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】一次性绘制完成时所占用的空间大小。当然,本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。这里说假设,意思是我们实际上并不一次性绘【未经授权禁止转载】【转载请注明来源】制完所有数据,而是只在canvas的vi【转载请注明来源】【本文首发于唐霜的博客】ewport遮盖区域内进行绘制。所以它们【未经授权禁止转载】【版权所有,侵权必究】的关系是:

【版权所有】唐霜 www.tangshu【版权所有,侵权必究】【版权所有,侵权必究】ang.net【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshu【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。ang.net

grid中viewport和canvas【未经授权禁止转载】【本文受版权保护】的关系示意图

转载请注明出处:www.tangshua原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】ng.net【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。
【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.n著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.netet 获取更多精彩内容】

上图中的阴影部分是无法用肉眼看到的,只有【本文首发于唐霜的博客】原创内容,盗版必究。viewport内部是可以被看到的。在w【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】eb开发中,通过overflow来轻易的【原创不易,请尊重版权】【作者:唐霜】实现滚动条,从而可以通过拖动viewpo本文作者:唐霜,转载请注明出处。【转载请注明来源】rt的滚动条查看canvas的每一个位置【转载请注明来源】【版权所有】唐霜 www.tangshuang.net

【版权所有】唐霜 www.tangshu【版权所有】唐霜 www.tangshuang.net【转载请注明来源】ang.net【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。

canvas作为gird绘制视图的对象,【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。grid的cells和columns将会【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】被绘制在canvas中,因此,从这个层面【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。讲,canvas虽然只是绘制的载体,但最【作者:唐霜】【关注微信公众号:wwwtangshuangnet】终包含来grid的基础元素,因此被视为一【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。个整体。在开发时,将基础元素和canva【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。s打包成一个实体,不需要再去考虑内部但r【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。ow和cell。

【未经授权禁止转载】原创内容,盗版必究。【原创不易,请尊重版权】

另一个问题是,columns可能被固定在【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。grid的顶部,滚动视图时,不会被遮盖。【本文受版权保护】本文版权归作者所有,未经授权不得转载。除了columns,在实际使用中还有一些本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net需求,要求左侧、右侧、顶部、底部固定一些【版权所有,侵权必究】【原创内容,转载请注明出处】真实的数据信息,而不是columns。这【作者:唐霜】本文版权归作者所有,未经授权不得转载。样的需求衍生出另外一个思考,就是需要将完未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。整的grid视图拆分为不同的区块,这些区著作权归作者所有,禁止商业用途转载。【作者:唐霜】块有的可能被固定在某个位置,但是所有这些【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net区块组合起来让用户可以看到符合逻辑的完整【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。的grid数据信息。而这种拆分,我认为用【版权所有,侵权必究】【转载请注明来源】另外一个概念来表达:layout。

【未经授权禁止转载】【未经授权禁止转载】【关注微信公众号:wwwtangshua【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】ngnet】

layout意思是布局,表示一个grid未经授权,禁止复制转载。【未经授权禁止转载】按照一定的思想被切分,按照特定的规则把切【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】分开的部分合理组合在一起。为了满足实际的未经授权,禁止复制转载。【原创不易,请尊重版权】需求,我将grid layout切分为3转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net×4的12个部分,如下图:

本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】

grid layout示意图

【作者:唐霜】【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。
【版权所有】唐霜 www.tangshu【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。ang.net【本文受版权保护】转载请注明出处:www.tangshua【未经授权禁止转载】本文作者:唐霜,转载请注明出处。ng.net

header部分区别于neck、body本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】、footer,因为它只用于展示colu转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.netmns信息。它的结构可能在一些细节上稍有【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。不同。

本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。

为什么要这样设计呢?它可以满足如下需求:

【本文首发于唐霜的博客】【转载请注明来源】【本文首发于唐霜的博客】【转载请注明来源】
  1. 横向滚动时,left、right可以被f转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.netixed,从而实现左侧、右侧的数据列固定
  2. 【本文受版权保护】【版权所有】唐霜 www.tangshu原创内容,盗版必究。原创内容,盗版必究。ang.net未经授权,禁止复制转载。
  3. 纵向滚动时,可以固定header、nec著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。k、footer,实现特定的头、行固定需转载请注明出处:www.tangshuang.net【转载请注明来源】
  4. 转载请注明出处:www.tangshua本文作者:唐霜,转载请注明出处。【作者:唐霜】ng.net【作者:唐霜】
  5. 当只需要简单结构,不需要固定时,隐藏对应【原创内容,转载请注明出处】【本文受版权保护】区域即可,例如不需要固定左侧,则left著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。所有区块hide,不需要footer,h本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。ide即可,最为简单的grid可能仅显示本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】header-middle和body-m【未经授权禁止转载】【本文首发于唐霜的博客】iddle。
  6. 本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshu【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.netang.net著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshu【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。ang.net

每一个区块拥有自己的viewport-c【本文首发于唐霜的博客】未经授权,禁止复制转载。anvas结构,区块本身实际上仅对应区块【作者:唐霜】本文作者:唐霜,转载请注明出处。本身的数据(包括columns)而不包含转载请注明出处:www.tangshuang.net【未经授权禁止转载】其它区块的数据展示,因此实际上grid没【作者:唐霜】本文作者:唐霜,转载请注明出处。有一个完整的展示所有数据的机会,只有这些【版权所有,侵权必究】【本文首发于唐霜的博客】区块全部正确展示数据时,才能正确把gri【本文受版权保护】未经授权,禁止复制转载。d反应给用户阅读。

【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】本文作者:唐霜,转载请注明出处。

这里提出的grid layout和很多其未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】它的grid组件存在本质的区别,很多组件【本文首发于唐霜的博客】未经授权,禁止复制转载。采用的是fake概念,也就是将表格复制一未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net份,左右展示。笔者曾经使用过dhtmlx【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】,是一个非常笨重的grid组件,它不仅代【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】码量大,而且无法清晰的解释如何实现我上述本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。提到的需求。它会告诉你,自己是如何实现左著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net侧固定列的,但是无法告诉你一种通用的固定转载请注明出处:www.tangshuang.net【转载请注明来源】策略。

本文作者:唐霜,转载请注明出处。【作者:唐霜】

最终,一个grid的组成可能是这样的结构著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net:layout->viewport转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。->canvas->rows【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net->cells

原创内容,盗版必究。原创内容,盗版必究。

滚动事件

我们需要去研究,用户滚动滚动条的目的,当【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net然很简单,是为了看非可视区域的可预判性数【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】据。但是当我们把整个grid切分为12个【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。区块之后,滚动变得有些复杂,如何简单有效【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】的去设计表格的滚动呢?

【本文首发于唐霜的博客】未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshua【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】ngnet】

实际上,header总是被固定的,当用户【作者:唐霜】转载请注明出处:www.tangshuang.net滚动滚动条时,其实并不希望表头消失,否则转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。他很难确定可视的数据的列信息。而left【原创不易,请尊重版权】【版权所有,侵权必究】, right, neck, foote【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。r这几个区域本身也是为固定设计的,因此,【原创不易,请尊重版权】【版权所有,侵权必究】实际上在滚动时,这几个区域根本也不会发生著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】本质的变动,最终,body-middle本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。这个区域才是滚动条的作用区域,只有这个区著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。域是任何滚动事件发生时都应该发生变化的。未经授权,禁止复制转载。【未经授权禁止转载】而left、right这两个区域在左右滚【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。动时保持不变,header、neck、f【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】ooter这三个区域在上下滚动时保存不变原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】。通过观察,我们发现header-lef【原创内容,转载请注明出处】原创内容,盗版必究。t, neck-left, footer【未经授权禁止转载】【未经授权禁止转载】-left, header-right,【作者:唐霜】【版权所有】唐霜 www.tangshuang.net neck-right, footer-【转载请注明来源】本文版权归作者所有,未经授权不得转载。right这些区域是永久固定不变的。

【版权所有】唐霜 www.tangshu【原创内容,转载请注明出处】【本文首发于唐霜的博客】ang.net【作者:唐霜】本文版权归作者所有,未经授权不得转载。

基于上面的这些观察,实际上,我们要考虑如【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net何安排滚动条的位置。最终,我将滚动条放在【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】body-right的右侧,footer本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】-middle的底部。

本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshu【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】ang.net本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshua【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。ngnet】

当右侧的纵向滚动条发生滚动时,整个bod原创内容,盗版必究。【版权所有,侵权必究】y区域的视图发生上下滚动;当底部的横向滚【原创内容,转载请注明出处】【未经授权禁止转载】动条发生滚动时,整个middle区域的视【原创不易,请尊重版权】【本文首发于唐霜的博客】图发生左右滚动。整个滚动事件就这么简单。

【本文受版权保护】【关注微信公众号:wwwtangshua本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】ngnet】【转载请注明来源】

在代码层面,我们需要实现滚动的联动效果,【本文受版权保护】本文作者:唐霜,转载请注明出处。也就是滚动滚动条时,其它区块的viewp著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】ort发生相同的滚动效果,或者在非滚动条【原创内容,转载请注明出处】原创内容,盗版必究。区域,比如在body-middle滚动鼠原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。标滚轮时,其它区域也同时发生联动效果。

原创内容,盗版必究。转载请注明出处:www.tangshua【版权所有,侵权必究】转载请注明出处:www.tangshuang.netng.net【作者:唐霜】

数据布局

前面所讲都是视图布局,数据如何按照视图布【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。局的需求,进行拆分和处理呢?实际上,在w【本文受版权保护】【未经授权禁止转载】eb开发中,数据可以仅存在一份,相互之间【本文首发于唐霜的博客】原创内容,盗版必究。可以引用。我们更关心的是,在全部数据中,【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。layout里的viewport应该获得【版权所有,侵权必究】【本文受版权保护】哪些数据用以渲染,这些数据最终决定来该v【原创不易,请尊重版权】【本文首发于唐霜的博客】iewport内的canvas的大小。这本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。里,我们引入一个新的概念:range。

【版权所有】唐霜 www.tangshu【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.netang.net【本文受版权保护】【版权所有】唐霜 www.tangshu著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。ang.net【作者:唐霜】

range表达了一个数据区域,即从第几行【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。到第几行、第几列到第几列的数据区域。用代【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。码表示为{ fromRow, toRow, fromColumn, toColumn }这样一个对象。

【本文受版权保护】【版权所有】唐霜 www.tangshu著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。ang.net

我们需要在两个地方有明确的range概念【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。:1. 每一个layout区块的rang【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】e,2. canvas的可视区域的ran【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】ge。

原创内容,盗版必究。【本文首发于唐霜的博客】

layout的range用以构建canv【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】as,而canvas的可视区域range【本文受版权保护】【关注微信公众号:wwwtangshuangnet】用以渲染。layout的range完全是原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】用户传入的,比如用户想固定前2列,那么l【作者:唐霜】【版权所有,侵权必究】eft区域的range一定有{ fromRow: 0, toRow: 1 },而这两列的宽度可以通过columns信本文版权归作者所有,未经授权不得转载。【作者:唐霜】息中得到,这样left区域的宽度就可以确本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。定了。同样的道理,其它区域的尺寸也可以通原创内容,盗版必究。【未经授权禁止转载】过类似的方法确定,最终剩下的区域就用总的【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】尺寸去减去已知的区域尺寸。这样下来,la【原创内容,转载请注明出处】【本文首发于唐霜的博客】yout基本就有了固定的尺寸,再将scr【未经授权禁止转载】转载请注明出处:www.tangshuang.netollbar考虑进去,视图布局就确定了。【原创内容,转载请注明出处】【未经授权禁止转载】viewport尺寸也跟着确定。

【原创不易,请尊重版权】【版权所有】唐霜 www.tangshu【转载请注明来源】著作权归作者所有,禁止商业用途转载。ang.net原创内容,盗版必究。转载请注明出处:www.tangshua【作者:唐霜】【本文受版权保护】ng.net

canvas的尺寸和layout差不多,【版权所有,侵权必究】【本文首发于唐霜的博客】但是不同的是,它必须知道完整的layou【未经授权禁止转载】本文作者:唐霜,转载请注明出处。t的range信息,因为canvas是通转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。过真实的数据得到尺寸的,所以在传入的配置著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。信息中,你必须告诉canvas rowH【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】eight信息。如果没有rowHeigh【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。t信息,无法得到canvas的尺寸。一般【转载请注明来源】【作者:唐霜】columns里面包含了width信息,转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】所以宽度信息基本是不用担心的,如果不存在转载请注明出处:www.tangshuang.net【未经授权禁止转载】,那么也必须传入一个columnWidt本文作者:唐霜,转载请注明出处。原创内容,盗版必究。h信息。

未经授权,禁止复制转载。【未经授权禁止转载】

canvas的可视区域的range则需要【版权所有,侵权必究】【作者:唐霜】viewport把当前scroll信息传著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。递给canvas,再由canvas利用自著作权归作者所有,禁止商业用途转载。【转载请注明来源】己的数据信息计算出具体应该渲染出哪些行哪【本文首发于唐霜的博客】原创内容,盗版必究。些列。而当滚动事件发生时这个计算过程需要【转载请注明来源】本文版权归作者所有,未经授权不得转载。反复发生,渲染也会反复发生,这是不可避免【转载请注明来源】【版权所有】唐霜 www.tangshuang.net的代价。不过,我们可以做很多缓存的工作。

【转载请注明来源】【版权所有】唐霜 www.tangshu【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】ang.net本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】

数据驱动

我们摒弃slicgrid中DataVie著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.netw的概念,转而使用DataDriver的【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。概念。数据层和视图层分离是注定的,对于数【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】据的操作会引发视图的联动效应,这也是注定【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。的。对于开发而言,开发者只需要关心数据如【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】何变得即可。例如新增了一条数据,修改了一【原创内容,转载请注明出处】【版权所有,侵权必究】条数据,删除了一条数据。这些操作仅仅需要【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net在数据层完成,完成数据操作之后,视图会自【作者:唐霜】【关注微信公众号:wwwtangshuangnet】动更新。

【作者:唐霜】原创内容,盗版必究。

这在当代开发中非常用以实现,react、【未经授权禁止转载】【原创内容,转载请注明出处】vue、redux、mobx都是非常好的【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】思路。问题在于,有没有必要为了实现数据驱本文作者:唐霜,转载请注明出处。【未经授权禁止转载】动而去加载其它的库,增加代码量?

本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshu【作者:唐霜】【本文首发于唐霜的博客】ang.net

另外一个话题是,如何设计数据结构。从结构【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。上,我们还是遵循slickgrid的当初著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。的设计,colunms、rows。数据视本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。图采用扁平的rows结构,由于是局部渲染本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。,我们必须采用position:abso著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.netlute绝对定位,无法使用float等布【作者:唐霜】【本文受版权保护】局方法,因此无法用display等css【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。属性来删除列之后又显示出来。这种操作只能【关注微信公众号:wwwtangshuangnet】【作者:唐霜】通过修改数据来做到。因此rows信息包含【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】两个层面,一个层面是原始数据,另一个层面【未经授权禁止转载】原创内容,盗版必究。是视图数据。grid真正要展示的是视图数【未经授权禁止转载】原创内容,盗版必究。据,但是原始数据是视图数据的根,因此,如本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】何在两者之间管理好,是一个大问题。

【未经授权禁止转载】本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。

最后还有一个问题,是数据节点的父子关系,著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】一条数据是另外一条数据的子节点,这种数据【原创内容,转载请注明出处】【本文首发于唐霜的博客】结构怎么来表达?我们采用来扁平的rows著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。结构,所以,只能通过增加_parent,未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。 _chidren属性等属性来表示引用。【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】当展开一个带有children的row时本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。,我们需要想办法把这些children从【本文首发于唐霜的博客】【转载请注明来源】原始数据中加载到视图数据中。而收起一个p著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】arent的时候,也要实现从视图数据中删本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。除。

本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】【原创不易,请尊重版权】

总结

本文最大的创新,是在grid layou【本文受版权保护】转载请注明出处:www.tangshuang.nett上,它非常优雅的解决来冻结行列问题。s原创内容,盗版必究。原创内容,盗版必究。lickgrid本身并没有考虑到这个层面【本文受版权保护】【原创不易,请尊重版权】,冻结列是在slickgrid的一个fo【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。rk中实现的,不是它的核心库。然而在现代本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。web数据表格中,冻结行列几乎是必备需求【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。。另外,本文没有探讨的一个问题是编辑问题著作权归作者所有,禁止商业用途转载。【转载请注明来源】,也就是用户可以在线像编辑excel一样著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。编辑自己的数据表。我认为,这个话题需要引【未经授权禁止转载】【本文受版权保护】申出另外一个话题,就是组件的插件/扩展机未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】制,如何在原有功能上实现简便的扩展。

【版权所有】唐霜 www.tangshu【未经授权禁止转载】原创内容,盗版必究。ang.net【未经授权禁止转载】【本文首发于唐霜的博客】【访问 www.tangshuang.n本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。et 获取更多精彩内容】

2017-12-11 8233 ,

为价值买单,打赏一杯咖啡

本文价值82.33RMB