快应用---组件(list)

一、list教程

       1)简单场景:在页面中实现 长列表 或者 屏幕滚动 等效果时,可以使用list。(平常会使用div,但是当DOM结构复杂时,滚动页面会出现卡顿现象,因为Native无法复用div组件实现的列表元素

而list由于会复用相同的type属性的list-item,使得更加流畅。

        使用list 组件代码如下:

        <template>

                <!--列表实现-->

                <list class="tutorial-page" onscrollbottom="loadMoreData"> 

                       <!--商品列表-->

                       <block for="{{productList}}">

                              <list-item type="product" class="content-item" οnclick="route($item.url)">

                               .........

                               </list-item>

                        </block>

                        <!--加载更多,type属性自定义命名为loadMore-->

                         <list-item type="loadMore" class="load-more">

                                 <progress type="circular">

                                 <text>加载更多</text>

                         </list-item>

                </list>

        </template>

         要实现DOM片段的复用,要求相同type属性的DOM结构完全相同。所以,设置相同type属性的list-item是优化列表滚动性能的关键

          注意:

                    list-item内不能再嵌套list

                    list-item 的type属性为必填属性

                    list-item内部需谨慎使用if指令或for指令,因为相同的type属性的list-itemde DOM结构必须完全相同,而使用if指令或for指令会造成DOM结构差异;可以使用show指令代替if指令

           2) 复杂场景:一个商品列表页,图片位于左边和图片位于右边的商品交错显示

列表中的列表元素可以分为三类,设置三种不同type属性的 list-item。分别为:

             a)图片在左,文字在右的list-item,type属性自定义命名为productLeft;

             b ) 图片在右,文字在左的list-item,type属性自定义命名为productRight;

             c)加载更多 list-item,type属性自定义命名为loadMore      

          <template>

                <!--列表实现-->

                <list class="tutorial-page" onscrollbottom="loadMoreData"> 

                       <block for="{{productList}}">

                              <!--图片在左,文字在右的list-item,type属性自定义命名为productLeft-->

                              <list-item type="productLeft" class="content-item" οnclick="route($item.url)" if="{{$idx%2===0}}">

                               .........

                               </list-item>

                               <!--图片在右,文字在左的list-item,type属性自定义命名为productRight-->

                              <list-item type="productRight" class="content-item" οnclick="route($item.url)" if="{{$idx%2===1}}">

                               .........

                               </list-item>

                        </block>

                        <!--加载更多,type属性自定义命名为loadMore-->

                         <list-item type="loadMore" class="load-more">

                                 <progress type="circular">

                                 <text>加载更多</text>

                         </list-item>

                </list>

        </template>

        list组件性能优化: 精简DOM层级,复用list-item,细粒度划分list-item,关闭scrollpage四个方面;

        其中,精简DOM层级,复用list-item是使用list组件必须遵循的优化原则,细粒度划分list-item,关闭scrollpage适用于部分场景;

        细粒度划分的list-item,即列表中相同的DOM结构划分为尽可能小的列表元素(即list-item)

        关闭scrollpage:list组件支持属性scrollpage,默认关闭,标志是否将顶部页面中非list元素随list一起滚动。开启scrollpage会降低list渲染性能,

         因此在开发者开启scrollpage前,推荐先尝试将顶部页面中非list的元素,作为一种或多种type属性的list-item,移入list从而达到关闭scrollpage提高渲染性能的目的

         

         3)list-item懒加载

          懒加载,简称 lazyload,本质上是按需加载;

          在传统页面中,常用的lazyload优化网页的性能

                     实现:不加载全部页面资源,当资源即将呈现在浏览器 可视区域 时,再加载资源;

                     优点:加快渲染的同时避免流量浪费

           在框架中,开发者也可以使用lazy-load概念优化列表的渲染:

                     实现:提前fetch请求足够的列表数据保存在内存变量memList中,当list滚动到底部时,从memList中提取部分数据来渲染list-item。当memList中数据不足时,提前fetch请求数据,填充memList

                     优点:每次网络请求与页面渲染的数量不一致,减少首屏渲染占用的JS执行时间,较少渲染后续list-item的等待时间;

          上述实现代码:

           import { dataComponentListLazyload } from '../../Common/js/data';

           //模拟fetch请求数据

           function callFetch(callback){

                  setTimeout(function(){

                        callback(dataComponentListLazyload);

                  },500)

           }

         //内存中存储的列表数据

          let memList = [];

         export default{

                private:{

                      productList:[],

                      hasMoreData: true,

                      size:10,//每次 渲染数据的商品数

                      isLoadingData:false,//是否正在fetch请求数据

                },

                onInit(){

                      this.$page.setTitleBar({ text:'list-item懒加载'});

                      this.loadAndRender();//获取数据并渲染列表

                 },

                 loadAndRender(doRender = true ){

                      this.isLoadingData = true;

                      //重新请求数据并根据数据模式判断是否需要渲染列表

                      callFetch(function(resList){

                             this.isLoadingData = false;

                             if(!resList){

                                  console.info('数据请求错误');

                             }

                             else if(!resList.length){

                                   this.hasMoreData = false;

                             }else{

                                   memList = memList.concat(resList);

                                   if(doRender){

                                         this._renderList();

                                   }

                             }

                      }.bind(this))

                 },

                 _renderList(){

                        if(memList.length>0){

                              const list = memList.splice(0,this.size);

                              this.productList = this.productList.concat(list);

                        }

                        if(memList.length<=this.size){

                               //提前请求新的数据

                               this.loadAndRender(false);

                        }

                 },

                 renderMoreListItem(){

                       if(!isLoadingData){

                              this._renderList();

                        }

                 }

          }

           

       4)吸顶效果

           传统页面的实现思路

           a)当手指向上滑动超过吸顶元素的初始位置,把吸顶元素固定在顶部;

           b)当手指向下滑动到底吸顶元素的初始位置时,取消吸顶元素在顶部的固定;

           吸顶在传统web页面中的实现思路是监听scroll事件,当页面滚动到一定位置时,做一些事情来改变吸顶元素在窗口中的位置;

            

           框架的实现思路

           注意:在框架中scroll仅适用于list组件,且获取的值是滚动的相对坐标值,在使用时,需要通过累加来获取当前滚动位置的绝对坐标;

           并且scroll在列表滚动时会被高频触发,存在潜在性能问题;

           采用stack组件作为整个页面的容器,stack组件的特性为:每个直接子组件按照先后顺序依次堆叠,覆盖前一个子组件;

            “吸顶”条件:

            a)当页面向下滚动到 顶部元素 消失在视野时,吸顶元素 需要固定在顶部,因此,监听 顶部元素的disappear事件,显示mask;

            b)当页面向上滚动到 顶部元素 出现杂视野时,吸顶元素需要取消固定,因此,监听 顶部元素的appear事件,隐藏mask

转载于:https://www.cnblogs.com/sunqq/p/11214907.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
oa-list-cell.vue 是一个用于在 OA(Office Automation 办公自动化)系统中展示列表项的 Vue 组件。该组件通常用于显示表格、列表或者其他类型的数据。它的主要作用是根据传入的数据,以特定的样式和布局展示列表项的内容。 oa-list-cell.vue 组件通常包含以下功能: 1. 数据展示:通过接收父组件传入的数据,oa-list-cell.vue 可以动态地展示不同类型的信息,比如文本、图片、数字等。 2. 自定义样式:开发者可以根据具体需求自定义 oa-list-cell.vue 的样式,比如文字大小、颜色、背景等。 3. 交互处理:在需要用户交互的情况下,oa-list-cell.vue 也可以添加点击事件或者其他交互处理函数,以响应用户的操作。 oa-list-cell.vue 组件在 OA 系统中具有较广泛的应用,比如在审批流程中展示审批单据的详情,或者在报表系统中展示数据列表。它的灵活性和可定制性使得开发者可以根据具体业务需求速构建出适合的数据展示界面。 在开发和使用 oa-list-cell.vue 组件时,需要注意以下几点: 1. 数据传递:确保父组件传递给 oa-list-cell.vue 的数据格式正确,并且包含了必要的信息。 2. 样式设计:根据 OA 系统的整体风格和设计规范,统一 oa-list-cell.vue 的样式,保持界面的整体统一性。 3. 性能优化:在数据量较大的情况下,需要考虑对 oa-list-cell.vue 进行性能优化,以保证页面加载和展示的流畅性。 综上所述,oa-list-cell.vue 是一个用于在 OA 系统中展示列表项的 Vue 组件,通过它可以速构建出符合业务需求的数据展示界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值