Vue或React的虚拟列表

Vue或React的虚拟列表,第1张

一直都用antd做工具开发,最近在开发过程中遇到了一个问题,就是表格组件,当数据行数达到1w+的时候,表格渲染就特别卡,加载也特别慢,这个时候就需要虚拟列表来解决。

虚拟列表,antd有现成的,不过antd是基于react的,vue版本没有虚拟表格,网上也有些基于vue的大数据表格,但都不是非常满意,所以准备自己写一个。

我们有成千上百条数据,但是列表渲染的数据条目是有限的,大部分是不需要显示的。这个时候如果渲染的数据是动态生成的,滚动的时候,看不到的数据会重新渲染成新的数据,那只需要列表里的数量就足够了,没必要渲染那么多节点。

列表条目的创建

第一行插入一个占位div,假设第一个在显示视图里的条目索引为i,那么0-i的高度总和就是div的高度。

计算视图可以渲染的数量为n,最后最后一行再增加一个占位div,i + n后的高度总和设为这个div的高度。

为了实现表格头冻结,我在虚拟列表做了滚动条的隐藏,自己实现滚动条,其实真正实现的时候,滚动条应该分离出这个组件。

data () {

    return {

        docmHeight: '0',  //默认屏幕高度

        showHeight:  '0',  //实时屏幕高度

        hidshow:true  //显示或者隐藏footer,

       isResize:false //默认屏幕高度是否已获取

    };

  },

mounted() {

    // windowonresize监听页面高度的变化

    windowonresize = ()=>{

        return(()=>{

                     if (!thisisResize) {

                               //默认屏幕高度

                               thisdocmHeight: documentdocumentElementclientHeight 

                               thisisResize = true

                       }

                        //实时屏幕高度

                       thisshowHeight = documentbodyclientHeight 

        })()

    }

  },

showHeight:function() {

        if(thisdocmHeight > thisshowHeight){

            thishidshow=false

        }else{

            thishidshow=true

        }

    }

<div class="footer" v-show="hidshow">

移动端点击输入框,d出键盘,底部被顶起问题

</div>

使用CSS来设置div的宽度

还可以将css写在css文件内,然后在html页面中进行引入

html:

css:

box{width:100px;}↓

vue调用本地打印的时候打印预览超出首先,为了使打印按钮始终固定显示在页面上部,对id=”print”所在的div的高度进行了计算,使其正好布满剩余屏幕高度。v-html引用的datas是从后端请求来的,由于数据很多,超出了一屏,且其父容器id=”print”设置了:overflow-y: auto;,使id=”print”容器出现了滚动条。

结果,点击打印按钮进行预览时,显示不全,后面的内容没有显示出来。原理:通过阅读vue-print-nb的源码,了解到vue-print-nb获取Id=”print”的内容,然后将这些内容放在了vue-print-nb新建的iframe的body标签中,同时将Id=”print”中的样式放在新建的iframe的style标签中。

然后经过各种转换、兼容,最终调用原生windowprint()执行打印

以下内容为例:

align=center

可选值:center,left,right。决定字、画、表格等居中、靠左或靠右的作用和居中标记

一样,前者是由HTML30开始的标准,后者是通用己久的标示法。

CSS单元的位置和层次-div标签

我们都知道,在网页上利用HTML定位文字和图象是一件“令人心痛”的事情。我们必须使用表格标签和隐式GIF图象,即使这样也不能保证定位的精确,因为浏览器和 *** 作平台不同会使显示的结果发生变化。

而CSS能使你看到希望的曙光。利用今天我们即将学到的CSS属性,你可以精确地设定元素的位置,还能将定位的元素叠放在彼此之上。

CascadingStyleSheets(CSS)是DHTML的基础。CSS用来设定你网页上的元素是如何展示的。CascadingStyleSheetsPositioning(CSS-P)是CSS的一个扩展,它可用来控制任何东西在网页上或是说在窗口中的位置。请你记住这两个名词:CSS和CSS-P。下面四个英文网址提供了详细的关于CSS和CSS-P的文件和解释。

1.使用DIV标签(div)

当我们使用CSS-P的时候,我们主要把它用在DIV(division)tag上。当你把文字,图象,或其他的放在DIV中,它可称作为“DIVblock”,或“DIVelement”或“CSS-layer”,或干脆叫“layer”。而中文我们把它称作“层次”。所以当你以后看到这些名词的时候,你就知道它们是指一段在DIV中HTML。

使用DIV的方法跟使用其他tag的方法一样:

ThisisaDIVtag

如果单独使用DIV而不加任何CSS-P,那么它在网页中的效果和使用是一样的。

但当我们把CSS-P用到DIV中去以后,我么就可以严格设定它的位置。首先我们需要给这个可以被CSS-P控制的DIV一个ID或说是它的名字。比如说我们给下面这个DIV的名字是truck。给名字的目的是我们以后可用JavaScript来控制它,比如说移动它或改变它的一些性质等等。

Thisisatruck

给层次取什么名字是随意的,名字可以是任何英文字母和数字,但第一个必须是字母。有两种把CSS-P应用到DIV的方法。

InlineCSS:Inline是最常用的方法。

Thisisatruck

ExternalSTYLEtag:使用External方法的结果是一样的。我们会在以后的课程里再详细解释这种方法。现在我们主要讨论Inline方法。请注意在External方法里,在STYLE里的ID和DIV里的关系。

Thisisatruck

Cross-BrowserCSS性质:

我们这个课程的主要目的是让你写出的网页在NS4和IE4上都能工作,所以我们主要讨论那些对俩者都通用的性质。下面这些性质符合由W3C给出的标准。

position决定DIVtag是如何放置的。“relative”意思是DIV的位置是相对于其他tag的,而“absolute”是说DIVtag的位置是相对于它所在的窗口。

left相对于窗口左边的位置

top相对于窗口上边的位置

widthDIVtag的宽度。所有在DIV里的文字或html都在里面。

heightDIVtag的高度。这个性质很少用除非你想Clip层次。

clip给出layer的clipping(可看的见的)部分。Clip可使得DIV显示为一个可以定义的很准确的方块。你可以用以下的四个值来给出这个方块的在DIV位置和大小。

clip:rect(top,right,bottom,left);

visibility隐蔽或展现DIV根据它的值“visible”,“hidden”,“inherit”。

z-indexDIVtag的立体位置。值越大DIV的位置越高。

background-colorDIV背景的颜色。

layer-background-colorNetscape的DIV背景颜色。

background-imageDIV的背景图象。

layer-background-imageNetscape的DIV的背景图象。

2.绝对定位和相对定位(position)

绝对定位:

定位属性将是网虫们打开幸福之门的钥匙:

H4{;left:100px;top:43px}

这项CSS规则让浏览器将

的起始位置精确地定在距离浏览器左边100象素,距离其顶部43象素的位置。注意这里唯一设置了的是左边和顶部,也就说,文字将从左到右,从上到下载入浏览窗口。

左边和顶部属性很直观,左边(left)设定要素距浏览器窗口左边的距离,顶部(top)设定距离浏览器窗口顶部的距离。设定这些距离时,你可以使用所学过的各种度单位或比例值。使用比例值时,比例值的是相对于母体要素的尺寸。

你可以定位什么呢?任何东西!段落、单词、GIF和JPEG图象、QUICKTIME**等等。

相对定位:

绝对定位使你能精确地定位元素在页面的独立位置,而不考虑页面其它要素的定位设置。相对定位指你所定位的元素的位置相对于在文件中所分配的位置。例:

I{;left:40px;top:10px}

相对定位的关键在于定位了的元素的位置是相对于它通常应在的位置进行定位。相对定位单元出现在普通的静态定位单元的行间,定位时没有把自己和静态定位单元完全分开。如果你停止使用相对定位,则文字的显示位置将恢复正常。使用相对定位时要小心,否则容易将页面弄得非常乱。

除了相对定位和绝对定位,你还可以使用static(静止)参数值。Static是position特性的缺省值。它的使用方法同普通HTML中的定位方法,不能附加特殊的定位设置。也就是说,除了边距特性,或通过使用float特性来浮动单元可影响单元的定位外,其它均不可以。

3.定位单元的控制(width、height、visiblility)

除了控制定位单元的左上角位置,你还可以控制单元的宽度和高度,及单元在页面的可视性。

宽度:定位了的元素在页面上显示时仍然会从左到右一直显示。利用宽度属性就可以设定字符向右流动的限制,即设定元素的宽度。

DIV{;left:200px;top:40px;width:150px}

浏览器接到这项规则时,它将文字按照规则规定的效果显示,还将段落最大水平尺寸限制在150象素。

宽度属性只适用于绝对定位的元素。你可以使用我们学过的任何一种长度单位,或使用比例值设定宽度,比例值指相对于母体元素的比例。IE4中,这项属性还可用于图象。你可以通过宽度设置人为地拉宽或压缩图象。

高度:理论上讲,高度应该和宽度的设置类似,只不过是在垂直方向上:

DIV{;left:200px;top:40px;height:150px}

这里我用了“理论上讲”,因为有些浏览器不支持高度属性。

可视性:利用CSS,你可以隐藏元素,使其在页面上看不见。这条属性对于定位了的和未定位的元素都适用。

H4{visibility:hidden}

选项:

visible使元素可以被看见

hidden使元素被隐藏

inherit指它将继承母体元素的可视性设置。

值inherit为缺省值。这使单元继承父单元的可见性。所以,如果某一段是隐藏的,则它包含的任何行间单元也都被隐藏。这一继承性可被明确指定的可见性取代。例如,段内的EM单元被指定为可见,这时如果该段被隐藏,则段内的所有其它内容都将消失,而唯有EM单元中的文本是可见的。

function AdjustColumnsHeight() {    var mainCol = windowdocumentgetElementById('MainColumn');    var leftCol = windowdocumentgetElementById('MainLeft');    var rightCol = windowdocumentgetElementById('MainRight');     var hMainCol =  mainCol offsetHeight;    var hLeftCol = leftColoffsetHeight;    var hRightCol = rightColoffsetHeight;     var maxHeight = Mathmax( hMainCol , Mathmax(hLeftCol, hRightCol));    mainColstyleheight = maxHeight + 'px';    leftColstyleheight = maxHeight + 'px';    rightColstyleheight = maxHeight + 'px';}

jQuery获取一个div的高度步骤:

第一步, 获取你要得到高度的那个div的jQuery对象, 获得方法有很多很多种, 具体你可以看一下jQuery API文档里的选择器部分, 在这里我只跟你说一个最直接的方法, 通过id获得: $("#div_id")

第二步, 要看你要得到的是什么高度了, jQuery里现有的三个(其实是两个)获得高度的方法是:

1 $("#div_id")height(); // 获得的是该div本身的高度, (不包含padding,margin,border)

2 $("#div_id")outerHeight(); // 包含该div本身的高度, padding上下的高度, 以及border上下的高度(不包含margin的高度)

3 $("#div_id")outerHeight(true); // 包含该div本身的高度, 以及padding,border,margin上下的总高度。

以上就是关于Vue或React的虚拟列表全部的内容,包括:Vue或React的虚拟列表、(vue)移动端点击输入框,d出键盘,底部被顶起问题、div标签怎么设置div的宽度_怎么设置div的宽度和高度等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9712827.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存