快应用list组件的那些事儿
本文是个人近段时间在开发快应用过程中,对快应用的list组件使用的一些体会和踩坑的记录。会简要分析一下快应用中list组件是怎样优化和渲染视图的原理。希望能给你开发快应用带来一些帮助。
list组件的使用方法
首先我们来看一下快应用中list
组件的使用方法
<list> <block for="[1,2,3]"> <list-item type="item"><text>content{{$item}}</text></list-item> </block> </list>
list
只接受list-item
和block
作为子组件,如果出现其他组件标签,应用会无情的抛出报错。
编译器报错
应用报错
官方文档上注明的list
子组件只能是list-item
是不严谨的,实际上block
也是可以的,原因在于block
组件实际上是表达逻辑区块的组件,没有对应的Native组件。
别在list-item中用if
注意:请尽量不要在list-item里面用if来控制元素的显示逻辑
因为list
组件原生端做了很多优化,为了提升长列表的性能,type
相同的list-item
会被复用,也就是说内存中驻留的list-item
是有限的,不会随着列表数据增多而变得占用太多内存,这本来是一个非常棒的事情,让开发者不用考虑一个列表中数据太大导致拖慢整个应用速度的问题,也不用考虑没显示出来的list-item
的懒加载,因为原生端把这些工作都做了,所以list
组件是个非常强大的组件。
但是,成也萧何败萧何,由于list-item
相同的会被复用,所以一旦你在list-item
中用了if
来控制元素的显示逻辑,由于if
的控制会导致结构的变化,所以会出现相同list-item
中有不同的结构的情况,那么问题来了,当原生端要复用的时候,结构并不相同,于是就会导致报错,严重的时候甚至会出现应用闪退。目前快应用的报错机制对前端开发者不太友好,这种错误往往会让你看的一脸懵逼。比如下面这种:
代码
<list> <block for="[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]"> <list-item style="height: 200px;" type="item"> <text if="$item === 1">content{{$item}}</text> <image if="$item === 3" src="https://doc.quickapp.cn/assets/images/logo.png"></image> </list-item> </block> </list>
报错截图
那么我们怎么来实现list-item
内部控制元素的显示呢,答案是用show
属性,因为show
属性不改变元素结构,只显示隐藏元素。
用list模拟scrollview
快应用中没有scrollview
组件,所以很多需要滚动的场景就需要用list
组件来模拟,垂直滚动的实现很简单,因为list
默认就是垂直滚动的,只要设置高度就好了,这里就不再赘述,主要讲一下水平滚动的实现。
<div class="box"> <list class="list"> <block for="[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]"> <list-item class="item" type="item"> <text>content{{$item}}</text> </list-item> </block> </list> </div>
.list { height: 300px; flex-direction: row; .item { width: 100px; } }
其实最关键的就是给list
组件设置样式flex-direction: row
就能快速地把垂直滚动变成水平滚动。
此外list
还支持一个columns
属性,这个属性可以帮助我们快速实现瀑布流的布局,当然这些文档中都有提到。建议大家把文档中list教程看一下,会对list
的使用有更深的体会。