<waterfall>

<waterfall> 只支持 Android 和 iOS,不支持 Web

简介

<waterfall> 组件是提供瀑布流布局的核心组件。瀑布流,又称瀑布流式布局是比较流行的一种页面布局,视觉表现为参差不齐的多栏布局。随着页面滚动条向下滚动,这种布局还可以不断加载数据块并附加至当前尾部。

  1. <template>
  2. <waterfall column-count="2" column-width="auto">
  3. <cell v-for="num in lists" >
  4. <text>{{num}}</text>
  5. </cell>
  6. </waterfall>
  7. </template>
  8. <script>
  9. export default {
  10. data () {
  11. return {
  12. lists: ['A', 'B', 'C', 'D', 'E']
  13. }
  14. }
  15. }
  16. </script>
  17. <style></style>

子组件

<list>组件一样, <waterfall> 组件的子组件只能包括以下四种组件或是 fix 定位的组件,其他形式的组件将不能被正确渲染。

  • <cell>:用于定义列表中的子列表项,类似于 HTML 中的 ul 之于 li。Weex 会对 <cell> 进行高效的内存回收以达到更好的性能。
  • <header>:当 <header> 到达屏幕顶部时,吸附在屏幕顶部。
  • <refresh>:用于给列表添加下拉刷新的功能。
  • <loading><loading> 用法与特性和 <refresh> 类似,用于给列表添加上拉加载更多的功能。
waterfall - 图1

属性

  • show-scrollbar : [可选] 可选值为 true/ false,默认值为 true。控制是否出现滚动条。 [H5无效]
  • column-count: [可选]描述瀑布流的列数
    • auto: 意味着列数是被其他属性所决定的(比如 column-width)
    • <integer>: 最佳列数,column-width 和 column-count 都指定非0值, 则 column-count 代表最大列数。
  • column-width : [可选]描述瀑布流每一列的列宽
    • auto: 意味着列宽是被其他属性所决定的(比如 column-count)
    • <length>: 最佳列宽,实际的列宽可能会更宽(需要填充剩余的空间), 或者更窄(如果剩余空间比列宽还要小)。 该值必须大于0
  • column-gap: [可选]列与列的间隙. 如果指定了 normal ,则对应 32.
  • left-gap: [可选]左边cell和列表的间隙. 如果未指定 ,则对应 0 需要 weex v0.19+.
  • right-gap: [可选]右边cell和列表的间隙. 如果未指定,则对应 0 需要 weex v0.19+.
waterfall - 图2

其他支持的属性参见 List 组件属性部分

事件

支持所有通用事件:

  • click:用于监听点击事件。(例如:一般绑定于子组件之上触发跳转)。
  • longpress:用于监听长按事件(一般绑定于子组件之上例如:手机淘宝猜你喜欢瀑布流,长按可删除您不感兴趣的商品)。
  • appear:用于监听子组件出现事件(一般绑定于子组件之上例如:监听最后一个元素出现,加载新的数据)
  • disappear:用于监听子组件滑出屏幕事件(一般绑定于子组件之上)

Vue 示例

体验示例

上述示例使用了4种子组件,同时点击不同的单元格,可体验 <waterfall> 不同属性间的区别。

无限加载瀑布流

无限加载瀑布流,当瀑布流滑动到底部时请求新的瀑布流数据形成可无限滑动的瀑布流。可利用最后一个子组件 appear 时触发请求(例如上述示例代码),也可通过 loadmore 事件触发。

Rax 示例

rax-waterfall<waterfall> 组件的上层封装,抹平了 Web 和 Weex 的展现

  1. import { createElement, useState, useRef, render } from 'rax';
  2. import View from 'rax-view';
  3. import Text from 'rax-text';
  4. import Driver from "driver-universal"
  5. import RefreshControl from 'rax-refreshcontrol';
  6. import Waterfall from 'rax-waterfall';
  7. // 数据需要指定高度
  8. const data = [
  9. { height: 550, item: {} },
  10. { height: 624, item: {} },
  11. { height: 708, item: {} },
  12. { height: 600, item: {} },
  13. { height: 300, item: {} },
  14. { height: 100, item: {} },
  15. { height: 400, item: {} },
  16. { height: 550, item: {} },
  17. { height: 624, item: {} },
  18. { height: 708, item: {} },
  19. { height: 600, item: {} },
  20. { height: 300, item: {} },
  21. { height: 100, item: {} },
  22. { height: 400, item: {} }
  23. ];
  24. let App = (props) => {
  25. let [refreshing, setRefreshing] = useState(false);
  26. let handleRefresh = () => {
  27. if (refreshing) {
  28. return;
  29. }
  30. setRefreshing(true);
  31. setTimeout(() => {
  32. setRefreshing(false);
  33. }, 500);
  34. }
  35. let loadMore = () => {
  36. console.log('load more');
  37. }
  38. return (
  39. <Waterfall
  40. columnWidth={370}
  41. columnCount={2}
  42. columnGap={10}
  43. dataSource={data}
  44. renderHeader={() => {
  45. return [
  46. <RefreshControl
  47. key="0"
  48. refreshing={refreshing}
  49. onRefresh={handleRefresh}>
  50. <Text>RefreshControl</Text>
  51. </RefreshControl>,
  52. <View key="1" style={{
  53. height: 100,
  54. backgroundColor: '#efefef',
  55. marginBottom: 10
  56. }}><Text>Header Mod</Text></View>
  57. ];
  58. }}
  59. renderFooter={() => {
  60. return <View key="3" style={{width: 750, height: 100, backgroundColor: '#efefef', marginTop: 10}}><Text>Footer Mod</Text></View>;
  61. }}
  62. renderItem={(item, index) => {
  63. return (
  64. <View style={{
  65. height: item.height,
  66. backgroundColor: '#efefef',
  67. marginBottom: 10
  68. }}>
  69. <Text>{index}</Text>
  70. </View>
  71. );
  72. }}
  73. onEndReached={loadMore} />
  74. );
  75. }
  76. render(<App />, document.body, { driver: Driver });

rax-waterfall 文档