List 分页列表
当你的列表接口采用 page 进行分页时,可以用这个组件快速实现列表页面,这个组件有用以下特性
- 下拉刷新
- 自动分页
- 空组件展示
- 自定义头部底部渲染
- RN端使用
@shopify/flash-list实现,拥有更好的性能 - 多列支持
如何创建列表组件,请参考入门教程分页列表
示例
以售后列表说明,导出的List组件,将会这样进行使用
- 当用户切换
navType时,将会自动重新获取数据 - renderEmpty渲染了一个数据为空时显示的组件
- renderItem需要传入一个组件,而非传染之后的内容
import { Header, ScrollView, TopView, GroupList, Column, Image, Form, FormItem, Menu, MenuItem, Empty, Text, Row } from '@/duxuiExample'
import { List, px } from '@/duxcms'
import classNames from 'classnames'
export default function ListExample() {
return <TopView>
<Header title='List' />
<Form>
{({ values }) => <>
<Menu>
<FormItem field='sort'>
<MenuItem title='排序' options={[{ name: '新品', value: 1 }, { name: '价格', value: 2 }]} />
</FormItem>
<FormItem field='class'>
<MenuItem title='分类' options={[{ name: '全部', value: 0 }, { name: '分类1', value: 1 }, { name: '分类2', value: 10 }]} />
</FormItem>
</Menu>
<ScrollView>
<GroupList>
<GroupList.Item title='数据列表' desc='此组件不可单独使用,需配合接口请求数据实现,此组件封装了分页,下拉刷新、上拉加载等功能,可以快速的实现一个列表页面。配合Form,可以实现快速筛选数据。列表需要放在一个具有一定高度的容器中,否则不会渲染。'>
<Column
style={{ height: px(1000) }}
>
<List
url='mall'
data={values}
columns={2}
// 样式对非RN端生效
listStyle={{ flexDirection: 'row', flexWrap: 'wrap', justifyContent: 'space-between' }}
renderItem={Item}
renderEmpty={<Empty title='暂无数据' />}
/>
</Column>
</GroupList.Item>
</GroupList>
</ScrollView>
</>}
</Form>
</TopView>
}
const Item = ({ item, index, action }) => {
// action.reload() 可以用于数据刷新
return <Column
className={classNames('bg-white r-2', index > 1 && 'mt-3')}
style={{ width: px(339) }}
>
<Image src={item.image} className='r-2 w-full' square />
<Column className='p-2 gap-2'>
<Text numberOfLines={2}>{item.title}</Text>
{!!item.activity && <Text size={1} color={2}>{item.activity}</Text>}
<Row className='gap-1' items='center'>
<Text size={6} bold>{item.sell_price}</Text>
<Text delete color={3} grow>{item.market_price}</Text>
</Row>
</Column>
</Column>
}
Props
url
| 类型 | 必填 | 默认值 |
|---|---|---|
| string | 否 |
和request的url相同
当 url 为空时:
- 不会发起请求(
usePageData的ready会自动变为false) - 不会触发下拉刷新与上拉加载(分页相关逻辑会自动关闭)
renderItem
每一项的渲染组件
| 类型 | 必填 | 默认值 |
|---|---|---|
| Component | 是 |
data
请求参数 request 的 data,当这个参数的内容改变时,会自动刷新数据
| 类型 | 必填 | 默认值 |
|---|---|---|
| object | 否 |
listData
直接指定列表数据(优先级高于内部请求返回的列表),常用于“只渲染列表,不由 List 发起请求”的场景
| 类型 | 必填 | 默认值 |
|---|---|---|
| any[] | 否 |
requestOption
其他的request请求参数
| 类型 | 必填 | 默认值 |
|---|---|---|
| RequestOption | 否 |
page
是否有分页,没有分页的接口可以设置false,默认true
| 类型 | 必填 | 默认值 |
|---|---|---|
| boolean | 否 | true |
cache
是否开启数据缓存
| 类型 | 必填 | 默认值 |
|---|---|---|
| boolean | 否 | false |
listField
接口返回的列表字段
如果指定的字段不存在,会判断上一级是不是数组,如果是就使用上一级作为列表
| 类型 | 必填 | 默认值 |
|---|---|---|
| string | 否 | list |
keyField
列表项的key
| 类型 | 必填 | 默认值 |
|---|---|---|
| string | 否 | id |
listCallback
请求回调函数 可以从这里获请求中的数据 需要返列表数据
两个参数,第一个是当前list,第二个是请求返回值,需要返回一个list
| 类型 | 必填 | 默认值 |
|---|---|---|
| (list: any[], result: any) => any[] | 否 |
reloadForShow
是否在页面显示出来的时候刷新数据
如果你使用了UI库的TabBar组件,并且是TabBar的组件中的列表,则可以这样传入
reloadForShow={{
useShow: TabBar.useShow
}}
| 类型 | 必填 | 默认值 |
|---|---|---|
| boolean 或 ReloadForShow | 否 | false |
reloadType
控制列表刷新的行为(用于 reloadForShow 和下拉刷新)
first:刷新到第一页(默认)top:仅当滚动接近顶部时才刷新(scrollTop < 100)
| 类型 | 必填 | 默认值 |
|---|---|---|
| enum('first', 'top') | 否 | first |