马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
先容
一个功能强盛的下拉革新和加载更多组件,支持自定义革新样式、空页面展示、加载更多状态、头布局和尾布局。组件内置了基础的革新动画、状态管理和数据管理,可以轻松实现列表的革新和加载功能。
功能特点
- 支持下拉革新与上拉加载更多功能
- 支持分页加载和数据管理
- 适配List/Grid/ScrollView/WaterFlow四种布局范例,也可以自行实现
- 内置空布局视图:可传入空布局参数改变空布局样式
- 支持自定义空布局
- 支持自定义革新样式和加载更多样式
- 头部/尾部扩展:支持自定义Header/Footer布局
- 支持页面数据不满一屏时主动触发上拉加载(必要手动开启)
- 支持数据分组,支持吸顶/吸尾
- 支持侧滑功能,包括左侧滑/右侧滑
- 兼容 V2 状态(该控件是 V2 控件)
链接
源码
示例
效果图
下载安装
在每个har/hsp模块中,通过ohpm工具下载安装库:
- ohpm install @hzw/zrefresh
复制代码 利用方法
根本利用示例
- // BaseRefreshController用于更新刷新状态
- @Local controller: BaseRefreshController = new BaseRefreshController()
- // BaseRefreshDataSource用于更新数据
- @Local data: BaseRefreshDataSource<String> = new BaseRefreshDataSource<String>()
- aboutToAppear() {
- this.controller.autoRefresh()
- }
- BaseRefresh({
- data: this.data, // 设置数据源
- controller: this.controller, // 设置状态管理
- type: BaseRefreshType.List, // 刷新内容类型,默认为滚动布局
- onRefresh: this.onRefresh, // 设置下拉刷新回调
- onLoadMore: this.onLoadMore, // 设置加载更多回调
- pageSize: 10, // 设置每页加载数量
- refreshModifier: new RefreshModifier(), // 设置Refresh样式
- listModifier: new ListModifier(), // 设置列表样式
- isShowHeader: false, // 设置是否显示头部布局
- isShowFooter: false, // 设置是否显示底部布局
- emptyStatus: {}, // 设置默认空布局样式,如果设置了,则数据为空时会显示默认布局
- customEmptyView: () => { // 设置自定义空布局,如果设置了,则数据为空时会显示自定义布局
- this.Empty()
- },
- customHeadView: () => { // 设置自定义头部布局
- this.Head()
- },
- customFootView: () => { // 设置自定义底部布局
- this.Footer()
- },
- customRefreshHeadView: () => { // 自定义刷新头布局
- this.RefreshHead()
- },
- customRefreshFootView: () => { // 自定义底部加载更多布局
- this.RefreshFoot()
- },
- builder: () => { // 内容
- this.Content()
- },
- })
复制代码 相关方法
触发革新
- // this.controller 是 BaseRefreshController 的实例
- this.controller.autoRefresh()
复制代码 添加数据
- // this.data 是 BaseRefreshDataSource 的实例
- this.data.complete(moreData)
复制代码 竣事下拉革新/竣事加载更多
- this.controller.finishRefresh()
- // 根据数据数量判断是否没有更多数据
- const data = ["1", "2"]
- this.controller.finishRefresh(data)
- // 也可以传入参数来手动设置是否没有更多数据
- this.controller.finishRefresh(noMore)
复制代码 竣事下拉革新
- this.controller.finishRefresh()
- // 根据数据数量判断是否没有更多数据
- const data = ["1", "2"]
- this.controller.finishRefresh(data)
- // 也可以传入参数来手动设置是否没有更多数据
- this.controller.finishRefresh(noMore)
复制代码 竣事加载更多
- this.controller.finishLoadMore()
- // 根据数据数量判断是否没有更多数据
- const data = ["1", "2"]
- this.controller.finishLoadMore(data)
- // 也可以传入参数来手动设置是否没有更多数据
- this.controller.finishLoadMore(noMore)
复制代码 空页面表现潜伏,不传默认表现
- this.controller.showEmpty(visible)
复制代码 头布局表现潜伏,不传默认表现
- this.controller.showHead(visible)
复制代码 底布局表现潜伏,不传默认表现
- this.controller.showFoot(visible)
复制代码 底部加载更多布局表现潜伏,不传默认表现
- this.controller.showRefreshFooter(visible)
复制代码 重置状态
- this.controller.resetStatus()
复制代码 关于 List(列表) 的革新示例,通过BaseRefreshController的实例的complete()方法设置数据
- @ComponentV2
- export struct RefreshListDemo {
- @Local controller: BaseRefreshController = new BaseRefreshController()
- @Local data: BaseRefreshDataSource<String> = new BaseRefreshDataSource<String>()
- @Local emptyData: boolean = false
- @Local pageSize: number = 15
- aboutToAppear() {
- this.controller.autoRefresh()
- }
- onRefresh = () => {
- this.loadData()
- }
- onLoadMore = () => {
- this.loadData()
- }
- loadData() {
- setTimeout(() => {
- if (this.emptyData) {
- this.data.complete([])
- this.controller.finishState([])
- return
- }
- const arr: number[] = []
- const start = (this.controller.pageIndex - 1) * this.pageSize
- if (this.controller.pageIndex == 2) {
- for (let i = start; i < start + 5; i++) {
- arr.push(i)
- }
- } else {
- for (let i = start; i < start + this.pageSize; i++) {
- arr.push(i)
- }
- }
- const result = Array.from(arr, (item, i) => `Item ${item + 1}`)
- this.data.complete(result)
- this.controller.finishState(result)
- return undefined
- }, 700)
- }
- build() {
- BaseRefresh({
- data: this.data, // 设置数据源
- controller: this.controller, // 设置状态管理
- type: BaseRefreshType.List, // 刷新内容类型,默认为滚动布局,当前设置为列表类型
- onRefresh: this.onRefresh, // 设置下拉刷新回调
- onLoadMore: this.onLoadMore, // 设置加载更多回调
- pageSize: this.pageSize, // 设置每页加载数量
- refreshModifier: new RefreshModifier(), // 设置Refresh样式
- listModifier: new ListModifier(), // 设置列表样式
- builder: () => { // 内容
- this.Content()
- },
- })
- }
- @Builder
- Content() {
- LazyForEach(this.data, (item: string) => {
- ListItem() {
- Stack() {
- Text(`${item}`)
- .borderRadius(10)
- .fontSize(20)
- .fontWeight(FontWeight.Bold)
- .fontColor(Color.White)
- .width('100%')
- .height('100%')
- .textAlign(TextAlign.Center)
- .backgroundColor(Color.Blue)
- }
- .width('100%')
- .height(100)
- .padding({ left: 10, right: 10, top: 10 })
- }
- }, (item: string, index: number) => `${item}${index}`)
- }
- }
复制代码 关于 Scroll(滚动) 的革新示例
- @ComponentV2
- export struct RefreshScrollDemo {
- @Local controller: BaseRefreshController = new BaseRefreshController()
- @Local emptyData: boolean = false
- aboutToAppear() {
- this.controller.autoRefresh()
- }
- onRefresh = () => {
- this.loadData()
- }
- onLoadMore = () => {
- this.loadData()
- }
- loadData() {
- setTimeout(() => {
- this.controller.showEmpty(this.emptyData)
- this.controller.finishRefresh()
- return undefined
- }, 700)
- }
- build() {
- Column() {
- OperateView({
- controller: this.controller,
- emptyData: this.emptyData!!
- })
- BaseRefresh({
- controller: this.controller, // 设置状态管理
- type: BaseRefreshType.ScrollView, // 刷新内容类型,默认为滚动布局,当前设置为滚动类型
- onRefresh: this.onRefresh, // 设置下拉刷新回调
- onLoadMore: this.onLoadMore, // 设置加载更多回调
- refreshModifier: new RefreshModifier(), // 设置Refresh样式
- scrollModifier: new ScrollModifier(), // 设置滚动样式
- isShowHeader: false, // 设置是否显示头部布局
- isShowFooter: false, // 设置是否显示底部布局
- emptyStatus: {}, // 设置默认空布局样式,如果设置了,则数据为空时会显示默认布局
- customEmptyView: () => { // 设置自定义空布局,如果设置了,则数据为空时会显示自定义布局
- this.Empty()
- },
- customHeadView: () => { // 设置自定义头部布局
- this.Head()
- },
- customFootView: () => { // 设置自定义底部布局
- this.Footer()
- },
- customRefreshHeadView: () => { // 自定义刷新头布局
- this.RefreshHead()
- },
- customRefreshFootView: () => { // 自定义底部加载更多布局
- this.RefreshFoot()
- },
- builder: () => { // 内容
- this.Content()
- },
- })
- .width('100%')
- .layoutWeight(1)
- }
- .width('100%')
- .height('100%')
- .backgroundColor(Color.White)
- }
- @Builder
- Content() {
- Stack() {
- Text(`滚动内容`)
- .borderRadius(10)
- .fontSize(20)
- .fontWeight(FontWeight.Bold)
- .fontColor(Color.White)
- .width('100%')
- .height('120%')
- .textAlign(TextAlign.Center)
- .backgroundColor(Color.Orange)
- }
- .padding({ left: 10, right: 10, top: 10 })
- }
- @Builder
- Empty() {
- CustomEmpty()
- }
- @Builder
- Head() {
- CustomHead()
- }
- @Builder
- Footer() {
- CustomFooter()
- }
- @Builder
- RefreshHead() {
- CustomRefreshHead()
- }
- @Builder
- RefreshFoot() {
- CustomRefreshFoot({ showEnd: this.controller.showEnd })
- }
- }
复制代码 关于 Grid(网格) 的革新示例
- @ComponentV2
- export struct RefreshGridDemo {
- @Local controller: BaseRefreshController = new BaseRefreshController()
- @Local data: BaseRefreshDataSource<String> = new BaseRefreshDataSource<String>()
- @Local emptyData: boolean = false
- @Local col: number = 2
- @Local pageSize: number = 15
- @Computed
- get colStr() {
- const arr: string[] = []
- for (let i = 0; i < this.col; i++) {
- arr.push('1fr')
- }
- return arr.join(' ')
- }
- aboutToAppear() {
- this.controller.autoRefresh()
- }
- onRefresh = () => {
- this.loadData()
- }
- onLoadMore = () => {
- this.loadData()
- }
- loadData() {
- setTimeout(() => {
- if (this.emptyData) {
- this.data.complete([])
- this.controller.finishState([])
- return
- }
- const arr: number[] = []
- const start = (this.controller.pageIndex - 1) * this.pageSize
- if (this.controller.pageIndex == 2) {
- for (let i = start; i < start + 5; i++) {
- arr.push(i)
- }
- } else {
- for (let i = start; i < start + this.pageSize; i++) {
- arr.push(i)
- }
- }
- const result = Array.from(arr, (item, i) => `Item ${item + 1}`)
- this.data.complete(result)
- this.controller.finishState(result)
- return undefined
- }, 700)
- }
- build() {
- BaseRefresh({
- data: this.data, // 设置数据源
- controller: this.controller, // 设置状态管理
- type: BaseRefreshType.Grid, // 刷新内容类型,默认为滚动布局,当前设置为网格类型
- onRefresh: this.onRefresh, // 设置下拉刷新回调
- onLoadMore: this.onLoadMore, // 设置加载更多回调
- pageSize: this.pageSize, // 设置每页加载数量
- refreshModifier: new RefreshModifier(), // 设置Refresh样式
- gridModifier: new GridModifier().columnsTemplate(this.colStr), // 设置网格样式
- builder: () => { // 内容
- this.Content()
- },
- })
- }
- @Builder
- Content() {
- LazyForEach(this.data, (item: string) => {
- GridItem() {
- Stack() {
- Text(`${item}`)
- .borderRadius(10)
- .fontSize(20)
- .fontWeight(FontWeight.Bold)
- .fontColor(Color.White)
- .width('100%')
- .height('100%')
- .textAlign(TextAlign.Center)
- .backgroundColor(Color.Blue)
- }
- .width('100%')
- .height(100)
- .padding({ left: 10, right: 10, top: 10 })
- }
- }, (item: string, index: number) => `${item}${index}`)
- }
- }
复制代码 关于 WaterFlow(瀑布流) 的革新示例
- @ComponentV2
- export struct RefreshWaterFlowDemo {
- @Local controller: BaseRefreshController = new BaseRefreshController()
- @Local data: BaseRefreshDataSource<String> = new BaseRefreshDataSource<String>()
- @Local emptyData: boolean = false
- @Local col: number = 2
- @Local pageSize: number = 15
- @Computed
- get colStr() {
- const arr: string[] = []
- for (let i = 0; i < this.col; i++) {
- arr.push('1fr')
- }
- return arr.join(' ')
- }
- aboutToAppear() {
- this.controller.autoRefresh()
- }
- onRefresh = () => {
- this.loadData()
- }
- onLoadMore = () => {
- this.loadData()
- }
- loadData() {
- setTimeout(() => {
- if (this.emptyData) {
- this.data.complete([])
- this.controller.finishState([])
- return
- }
- const arr: number[] = []
- const start = (this.controller.pageIndex - 1) * this.pageSize
- if (this.controller.pageIndex == 2) {
- for (let i = start; i < start + 5; i++) {
- arr.push(i)
- }
- } else {
- for (let i = start; i < start + this.pageSize; i++) {
- arr.push(i)
- }
- }
- const result = Array.from(arr, (item, i) => `Item ${item + 1}`)
- this.data.complete(result)
- this.controller.finishState(result)
- return undefined
- }, 700)
- }
- build() {
- BaseRefresh({
- data: this.data, // 设置数据源
- controller: this.controller, // 设置状态管理
- type: BaseRefreshType.WaterFlow, // 刷新内容类型,默认为滚动布局,当前设置为瀑布流类型
- onRefresh: this.onRefresh, // 设置下拉刷新回调
- onLoadMore: this.onLoadMore, // 设置加载更多回调
- pageSize: this.pageSize, // 设置每页加载数量
- refreshModifier: new RefreshModifier(), // 设置Refresh样式
- scrollModifier: new ScrollModifier(), // 设置滚动样式,因为瀑布流类型是 Scroll嵌套WaterFlow来实现头尾布局,所以用到了Scroll控件
- waterFlowModifier: new WaterFlowModifier().columnsTemplate(this.colStr), // 设置瀑布流样式
- builder: () => { // 内容
- this.Content()
- },
- })
- }
- @Builder
- Content() {
- LazyForEach(this.data, (item: string, index: number) => {
- FlowItem() {
- Stack() {
- Text(`${item}`)
- .borderRadius(10)
- .fontSize(20)
- .fontWeight(FontWeight.Bold)
- .fontColor(Color.White)
- .width('100%')
- .height('100%')
- .textAlign(TextAlign.Center)
- .backgroundColor(Color.Blue)
- }
- .height(Math.random() * 100 + 100)
- .padding({ left: 10, right: 10, top: 10 })
- }
- .width('100%')
- }, (item: string, index: number) => `${item}${index}`)
- }
- }
复制代码 关于 No(不指定滚动布局范例,自行实现) 的革新示例
- @ComponentV2
- export struct RefreshNoDemo {
- @Local controller: BaseRefreshController = new BaseRefreshController()
- @Local emptyData: boolean = false
- aboutToAppear() {
- this.controller.autoRefresh()
- }
- onRefresh = () => {
- this.loadData()
- }
- onLoadMore = () => {
- this.loadData()
- }
- loadData() {
- setTimeout(() => {
- this.controller.showEmpty(this.emptyData)
- this.controller.finishRefresh()
- return undefined
- }, 700)
- }
- build() {
- BaseRefresh({
- controller: this.controller, // 设置状态管理
- type: BaseRefreshType.No, // 刷新内容类型,无滚动类型(不内置滚动控件,交由使用者自定义)
- onRefresh: this.onRefresh, // 设置下拉刷新回调
- onLoadMore: this.onLoadMore, // 设置加载更多回调
- refreshModifier: new RefreshModifier(), // 设置Refresh样式
- scrollModifier: new ScrollModifier(), // 设置滚动样式
- builder: () => { // 内容
- this.Content()
- },
- })
- }
- @Builder
- Content() {
- Scroll() {
- Stack() {
- Text(`滚动内容`)
- .borderRadius(10)
- .fontSize(20)
- .fontWeight(FontWeight.Bold)
- .fontColor(Color.White)
- .width('100%')
- .height('120%')
- .textAlign(TextAlign.Center)
- .backgroundColor(Color.Orange)
- }
- .padding({ left: 10, right: 10, top: 10 })
- }
- }
- }
复制代码 参数分析
BaseRefresh 组件参数
参数名范例默认值必填分析dataBaseAbsRefreshDataSource | undefinedundefined是数据源,需继续BaseAbsRefreshDataSourcetypeBaseRefreshTypeScrollView否内容范例:List/ScrollView/Grid/WaterFlow/NoenableRefreshbooleantrue否是否启用下拉革新enableLoadMorebooleantrue否是否启用加载更多pageSizenumber20否每页加载数量controllerBaseRefreshControllernew BaseRefreshController()是状态控制器scrollerScrollernew Scroller()是滚动控制器实例refreshModifierRefreshModifiernew RefreshModifier()否革新控件样式设置listModifierListModifiernew ListModifier()否列表样式设置scrollModifierScrollModifiernew ScrollModifier()否滚动视图样式设置gridModifierGridModifiernew GridModifier()否网格布局样式设置waterFlowModifierWaterFlowModifiernew WaterFlowModifier()否瀑布流样式设置listItemModifierListItemModifiernew ListItemModifier()否列表项样式设置(需设置listBuilder收效)onRefresh() => Promise<Object[]|undefined>async () => {}是下拉革新回调函数onLoadMore() => Promise<Object[]|undefined>async () => {}是加载更多回调函数builder() => voidthis.doBuilder是内容构建函数listBuilder(data: Object, index: number) => voidundefined否列表项构建函数(设置后builder属性失效)swipeLeftBuilder(data: Object, index: number) => voidundefined否列表项左滑布局(需设置listBuilder收效)swipeRightBuilder(data: Object, index: number) => voidundefined否列表项右滑布局(需设置listBuilder收效)isShowHeaderbooleanfalse否是否表现头部布局isShowFooterbooleanfalse否是否表现底部布局isShowRefreshFooterbooleantrue否是否表现加载更多布局groupDataBaseAbsRefreshDataSource | undefinedundefined是分组数据源(需设置listBuilder收效)listItemGroupModifierListItemGroupModifiernew ListItemGroupModifier()否列表项分组样式设置(需设置listBuilder和groupData收效)listItemGroupHeadBuilder(data: BaseRefreshGroupItem, index: number) => voidundefined否列表分组头部构建函数(需设置listBuilder和groupData收效)listItemGroupFootBuilder(data: BaseRefreshGroupItem, index: number) => voidundefined否列表分组底部构建函数(需设置listBuilder和groupData收效)groupStyleListItemGroupStyle | undefinedundefined否列表分组样式设置(需设置listBuilder和groupData收效)isGroupTopStickybooleantrue否列表分组是否顶部吸顶(需设置listBuilder和groupData收效)isGroupFootStickybooleanfalse否列表分组是否底部吸顶(需设置listBuilder和groupData收效)isAutoLoadMoreWhileNoFullbooleanfalse否页面数据不满一屏时是否主动触发上拉加载customEmptyView() => voidundefined否自定义空布局组件customHeadView() => voidundefined否自定义头部布局customFootView() => voidundefined否自定义底部布局customRefreshHeadView() => voidundefined否自定义革新头部组件customRefreshFootView() => voidundefined否自定义加载底部组件emptyStatusBaseRefreshEmptyStatus | undefinedundefined否空布局状态设置gridLayoutOptionsGridLayoutOptions | undefinedundefined否网格布局设置选项BaseRefreshController 类方法
方法名参数返回值分析autoRefresh-void主动触发革新finishStatenoMore: (Object | undefined | null)[] | undefined | null | booleanvoid根据当前状态竣事革新/加载finishRefreshnoMore?: (Object | undefined | null)[] | undefined | null | booleanvoid竣事革新状态finishLoadMorenoMore?: (Object | undefined | null)[] | undefined | null | booleanvoid竣事加载更多状态showEmptyvisible?: boolean控制空页面表现showHeadvisible?: booleanvoid控制头部布局表现状态showFootvisible?: booleanvoid控制底部布局表现状态showRefreshFootervisible?: booleanvoid控制加载更多布局表现状态resetStatus-void重置全部状态到初始值(包罗refreshing/loadMore/showEnd等)onScrollIndexstart: number, end: numbervoid列表/网格滚动索引变革回调,当滚动到底部时触发加载onScrollEdgeedge: Edgevoid滚动视图到达边沿回调(Edge.Bottom时触发加载)onScrollFrameBeginoffset: numberBaseRefreshOffsetInterface滚动偏移量变革回调,用于判断滑动方向BaseRefreshDataSource 类方法
方法名参数返回值分析add1stItemdata: Tvoid在列表头部插入元素addLastItemdata: Tvoid在列表尾部追加元素addItemindex: number, data: Tvoid在指定位置插入元素delete1stItem-void删除第一个元素deleteItemByIndexindex: numbervoid删除指定索引元素deleteItemdata: Tvoid删除指定元素setItemindex: number, data: Tvoid更新指定位置元素clear-void清空全部数据notifyDataReload-void关照数据重载notifyDataAddindex: numbervoid关照数据添加变乱notifyDataChangeindex: numbervoid关照数据变更变乱notifyDataDeleteindex: numbervoid关照数据删除变乱completedata: T[] | undefinedvoid完成加载利用(根据革新状态决定更换或追加数据)作者其他库
- 鸿蒙数据库工具:https://gitee.com/HW-Commons/ZDbUtil
接洽我们
接待各人提交issue、PR(可以同一收集标题,方便更多人查阅,会第一时间复兴处理处罚) ,或进群交换(+v: _hhbin)。
|