list.md 6.8 KB
Newer Older
Q
qiang 已提交
1 2 3 4 5 6 7 8 9 10
#### list

app端nvue专用组件。在app-nvue下,如果是长列表,使用list组件的性能高于使用view或scroll-view的滚动。原因在于list在不可见部分的渲染资源回收有特殊的优化处理。

原生渲染的资源回收机制,与webview渲染不同。webview不需要数据有规则格式,长页面处于不可视的部分,其渲染资源会自动回收,除非webview使用区域滚动而不是页面滚动。所以vue页面只要不用scroll-view,就不需要关注这个问题。而原生渲染则必须注意。

**如果需要跨端,建议使用uni-ui的uni-list组件,它会自动处理webview渲染和原生渲染的情况,在app-nvue下使用list组件,而在其他平台则使用页面滚动。详见[https://ext.dcloud.net.cn/plugin?id=24](https://ext.dcloud.net.cn/plugin?id=24)**

`<list>` 组件是提供垂直列表功能的核心组件,拥有平滑的滚动和高效的内存管理,非常适合用于长列表的展示。最简单的使用方法是在 `<list>` 标签内使用一组由简单数组循环生成的 `<cell>` 标签填充。

D
DCloud_LXH 已提交
11
```html
Q
qiang 已提交
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
<template>
  <list>
    <!-- 注意事项: 不能使用 index 作为 key 的唯一标识 -->
    <cell v-for="(item, index) in dataList" :key="item.id">
      <text>{{item.name}}</text>
    </cell>
  </list>
</template>

<script>
  export default {
    data () {
      return {
        dataList: [{id: "1", name: 'A'}, {id: "2", name: 'B'}, {id: "3", name: 'C'}]
      }
    }
  }
</script>
```

> **注意**
> - 相同方向 `<list>` 或者 `<scroll-view>` 互相嵌套时,Android 平台子 `<list>` 不可滚动,iOS 可以,iOS 有Bounce效果, Android仅可滚动时有
> - `<list>` 需要显式的设置其宽高,可使用 position: absolute; 定位或 width、height 设置其宽高值。
study夏羽's avatar
study夏羽 已提交
35
> - list是区域滚动,不会触发页面滚动,无法触发pages.json配置的下拉刷新、页面触底onReachBottomDistance、titleNView的transparent透明渐变、style的transparentTitle导航栏透明。
Q
qiang 已提交
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
> - Android 平台,因 `<list>` 高效内存回收机制,不在屏幕可见区域的组件不会被创建,导致一些内部需要计算宽高的组件无法正常工作,例如 `<slider>`、`<progress>`、`<swiper>`

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

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

#### 属性

|属性名|说明|类型|默认值|
|:-|:-|:-|:-|
|show-scrollbar|控制是否出现滚动条|boolean|true|
|bounce|控制是否回弹效果, iOS 不支持动态修改|boolean|true|
|loadmoreoffset|触发 loadmore 事件所需要的垂直偏移距离(设备屏幕底部与 list 底部之间的距离),建议手动设置此值,设置大于0的值即可|number|0|
|offset-accuracy|控制 onscroll 事件触发的频率:表示两次onscroll事件之间列表至少滚动了10px。注意,将该值设置为较小的数值会提高滚动事件采样的精度,但同时也会降低页面的性能|number|10|
|pagingEnabled|是否按分页模式显示List,默认值false|boolean|true/false|
|scrollable|是否允许List滚动|boolean|true/false|
|enable-back-to-top|iOS点击顶部状态栏滚动条返回顶部,只支持竖向|boolean|false|
Anne_LXM's avatar
Anne_LXM 已提交
59
|render-reverse|定义是否从底部渲染,需搭配cell的属性render-reverse-position共同使用,单独配置会导致渲染异常。HBuilderX3.6.9+支持|boolean|false|
Q
qiang 已提交
60 61 62

`loadmoreoffset` 示意图:

D
DCloud_LXH 已提交
63
<img src="https://web-assets.dcloud.net.cn/unidoc/zh/app-nvue-component-list.png" />
Q
qiang 已提交
64 65 66 67 68 69 70 71 72 73 74 75 76 77

#### setSpecialEffects(object)
设置嵌套list父容器支持swiper-list吸顶滚动效果

###### Object object
属性|说明|类型|必填|备注
:--|:--|:--|:--|:--|
id|list父容器滚动组件id|String|是|应为最外层滚动容器,必须是list组件
headerHeight|吸顶距离|Number|是|子list吸顶距离最外层滚动容器顶部的距离

#### 方法

`scrollToElement(ref, options)`

D
DCloud_LXH 已提交
78
滚动到指定位置,详情 [scrollToElement](https://uniapp.dcloud.net.cn/tutorial/nvue-api.html#dom)
Q
qiang 已提交
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

#### 事件


- `loadmore` 事件
如果列表滚动到底部将会立即触发这个事件,你可以在这个事件的处理函数中加载下一页的列表项。 如果未触发,请检查是否设置了loadmoreoffset的值,建议此值设置大于0

- 如何重置 loadmore

```html
<template>
  <list ref="list">
    <cell v-for="num in lists">
      <text>{{num}}</text>
    </cell>
  </list>
</template>

<script>
  export default {
    data () {
      return {
        lists: ['A', 'B', 'C', 'D', 'E']
      }
    },
    methods: {
        // 重置 loadmore
        resetLoadMore() {
            this.$refs["list"].resetLoadmore();
        }
    }
  }
</script>
```

- `scroll` 事件
列表发生滚动时将会触发该事件,事件的默认抽样率为 10px,即列表每滚动 10px 触发一次,可通过属性 offset-accuracy 设置抽样率。

  事件中的 event 对象属性:
  - `contentSize {Object}`:列表的内容尺寸
    - `width {number}`:列表内容宽度
    - `height {number}`:列表内容高度
  - `contentOffset {Object}`:列表的偏移尺寸
    - `x {number}`:x轴上的偏移量
    - `y {number}`:y轴上的偏移量
  - `isDragging {boolean}`: 用户是否正在拖动列表



####  list.setSpecialEffects(args)

设置嵌套父容器信息

#### 参数:

args 为要设置的参数为json类型可以包含下列元素

属性|类型 |默认值|必填|说明
:--|:--|:--|:--|:--|
id|string|无|是|和list同时滚动的组件id,应为外层的scroller
headerHeight|float|0|是|要吸顶的header顶部距离scroller顶部的距离,Android暂不支持

#### 返回值:无

#### 示例:

```html
<template>
Anne_LXM's avatar
Anne_LXM 已提交
147
    <!-- ios 需要配置 fixFreezing="true" -->
Q
qiang 已提交
148 149 150 151 152 153 154 155 156 157 158 159 160
    <view class="uni-swiper-page">
        <list ref="list" fixFreezing="true">
        </list>
    </view>
</template>

<script>
  export default {
    data () {
      return {
      }
    },
    methods: {
Anne_LXM's avatar
Anne_LXM 已提交
161 162 163 164 165 166 167
      // 重置 loadmore
      setSpecialEffects() {
        this.$refs["list"].setSpecialEffects({id:"scroller", headerHeight:150});
      },
      clearSpecialEffects() {
        this.$refs["list"].setSpecialEffects({});
      }
Q
qiang 已提交
168 169 170 171 172 173
    }
  }
</script>
```

`setSpecialEffects` 完整代码: [https://github.com/dcloudio/hello-uniapp/tree/master/pages/template/swiper-list-nvue](https://github.com/dcloudio/hello-uniapp/tree/master/pages/template/swiper-list-nvue)