Skip to content

Waterflow 瀑布流

查看 sn-waterflow 的 2.0 版本差异

基础用法

  • 数据驱动的瀑布流组件:App 端基于官方 waterflow 组件(flow-item 复用回收),Web 端为自研虚拟滚动瀑布流(动态测量条目高度,仅渲染可视区域及 overscan 范围内的条目)。
  • 通过 list 属性传入数据数组,配合默认作用域插槽(参数 itemindex)渲染每个卡片。
  • 内置下拉刷新(sn-refresher)、加载更多(sn-loadmore)与回到顶部按钮(sn-backtop)。
  • App 端条目按数据项 type 字段分组复用,内部保留了两个特殊 type 值:下拉刷新条目为 2、加载更多条目为 6,业务数据请避开。
vue
<template>
	<sn-waterflow :list="items" :cross-axis-count="2" cross-axis-gap="10" main-axis-gap="12"
		refresher-enabled v-model:refresher-triggered="refresherTriggered"
		loadmore v-model:loadmore-status="loadmoreStatus" backtop
		@refresh="onRefresh" @loadmore="onLoadmore">
		<template v-slot:default="slotProps">
			<view class="flow-card" :style="cardStyle(slotProps.item)">
				<sn-text bold color="$primaryText">{{ flowTitle(slotProps.item) }}</sn-text>
			</view>
		</template>
	</sn-waterflow>
</template>

<script setup>
	type FlowItem = {
		title: string
		height: number
	}
	function flowTitle(item: any): string {
		return (item as FlowItem).title
	}
	function cardStyle(item: any): Map<string, any> {
		const styles = new Map<string, any>()
		styles.set('height', `${(item as FlowItem).height}px`)
		styles.set('background-color', 'var(--sn-primaryLight)')
		styles.set('border-radius', '10px')
		return styles
	}
</script>

更多演示请下载 demo 查看

插槽的 itemany 类型,对象的字段访问需在函数体内 as 强转后使用,不要直接在模板内访问属性。

自定义列数与响应式断点

  • cross-axis-count 控制基础列数(最小为 1)。
  • Web 端支持两种自适应方式:col-width 大于 0 时按容器宽度与列宽计算实际列数(不超过 cross-axis-count);breakpoints 传入响应式断点数组(minWidth 容器最小宽度、columns 对应列数),取容器宽度匹配到的最后一项。
vue
<template>
	<sn-waterflow :list="items" :cross-axis-count="3" cross-axis-gap="8" main-axis-gap="10"
		:col-width="140" :estimated-item-height="180" :overscan="200">
		<template v-slot:default="slotProps">
			<view class="flow-card">
				<sn-text :text="flowTitle(slotProps.item)"></sn-text>
			</view>
		</template>
	</sn-waterflow>
</template>

无限加载

  • loadmore 开启后触底自动触发 loadmore 事件(App 端与 Web 端均为滚动接近底部时触发,触发距离由 lower-threshold 控制)。
  • 无限滚动场景可将 show-loadmore 设为 false 隐藏底部加载状态条,加载逻辑照常生效。
vue
<template>
	<sn-waterflow :list="items" :cross-axis-count="2" :lower-threshold="4000"
		loadmore :show-loadmore="false" v-model:loadmore-status="loadmoreStatus"
		@loadmore="onLoadmore">
		<template v-slot:default="slotProps">
			<view class="flow-card">
				<sn-text :text="flowTitle(slotProps.item)"></sn-text>
			</view>
		</template>
	</sn-waterflow>
</template>

属性

参数说明类型默认值可选值
list列表数据数组,数据项可为任意对象,App 端支持 type 数字字段声明复用分组Array[]-
crossAxisCount列数Number2-
crossAxisGap列间距(支持 $ 简写)String | Number10px-
mainAxisGap行间距(支持 $ 简写)String | Number10px-
colWidth单列基准宽度(单位 px,Web 端生效;大于 0 时按容器宽度自适应实际列数,不超过 crossAxisCountNumber0-
estimatedItemHeight条目预估高度(单位 px,Web 端虚拟滚动初始布局用,实际高度测量后自动修正)Number280-
overscan虚拟滚动预渲染范围(单位 px,Web 端生效)Number400-
breakpoints响应式断点数组(Web 端生效),每项含 minWidth(容器最小宽度)与 columns(对应列数)SnWaterflowBreakpoint[][]-
v-model:refresher-triggered绑定当前下拉刷新状态Booleanfalsetrue | false
v-model:loadmore-status绑定加载更多组件状态,触底或点击加载更多时组件内部自动改写为 loading,由父组件在 loadmore 事件中更新加载结果Stringloadmoreloadmore | loading | nomore
refresherEnabled是否开启下拉刷新Booleanfalsetrue | false
refresherConfig下拉刷新组件配置(refreshTextrefreshingTexttextSizetextColoriconiconSizeiconColorSnRefresherParams{}-
refresherThreshold下拉刷新阈值(单位 px)Number45-
refresherMaxDragDistance下拉最大拖拽距离(单位 px)Number0-
refresherBackground下拉刷新区域背景颜色Stringtransparent-
refresherDefaultStyle下拉刷新默认样式;开启下拉刷新时组件强制使用自定义刷新条Stringblackwhite | black | none
loadmore是否开启加载更多Booleantruetrue | false
showLoadmore是否显示底部加载状态条(为 false 时隐藏条目但加载逻辑照常生效)Booleantruetrue | false
loadmoreConfig加载更多组件配置(loadmoreTextnomoreTextloadingTexttextSizetextColoriconSizeiconColorlineHeightlineColordasheddisabledSnLoadmoreParams{}-
backtop是否内置回到顶部按钮Booleanfalsetrue | false
backtopTarget内置回到顶部按钮的绑定目标(ref 名或元素 id)String''-
backtopTop内置回到顶部按钮的显示阈值(滚动距离,单位 px)Number400-
backtopRight内置回到顶部按钮距右边界距离(单位 px)Number30-
backtopBottom内置回到顶部按钮距下边界距离(单位 px)Number100-
bounces是否启用回弹效果(App 端)Booleantruetrue | false
associativeContainer关联的滚动容器(App 端嵌套滚动场景使用)String''-
maxCrossAxisExtent单列最大宽度(单位 px,超过则自动增加列数;iOS / HarmonyOS 端生效)String | Number0-
upperThreshold距顶部多远时(单位 px)触发 scrolltoupper 事件Number50-
lowerThreshold距底部多远时(单位 px)触发 scrolltolower 事件并触发加载更多Number50-
scrollTop设置竖向滚动条位置Number0-
scrollLeft设置横向滚动条位置Number0-
scrollIntoView值应为某子元素 id(id 不能以数字开头),滚动到该元素String''-
scrollWithAnimation设置滚动条位置时是否使用滚动动画Booleantruetrue | false
showScrollbar是否显示滚动条Booleantruetrue | false
androidOverscrollAndroid 端是否开启弹簧回弹效果Booleanfalsetrue | false
androidScrollbarDraggableAndroid 端滚动条是否可拖拽Booleanfalsetrue | false
androidRefresherColorAndroid 端下拉刷新默认样式颜色String''-
enableBackToTop点击状态栏回到顶部(iOS 端生效)Booleanfalsetrue | false
enablePassiveWeb 端原生滚动监听是否使用 passive 模式BooleanWeb 端 true,其他端 falsetrue | false
customStyle自定义根节点样式UTSJSONObject | String''-
customClass自定义根节点外部样式类String''-

下拉刷新区域文案与样式配置:refreshText(下拉中)、refreshingText(刷新中)、textSizetextColoriconiconSizeiconColor

sn-loadmore / 列表加载更多的文案与样式配置:loadmoreText(加载前)、nomoreText(没有更多)、loadingText(加载中)、textSizetextColoriconSizeiconColorlineColorlineHeightdashed(线条虚线)、disabled

事件

名称类型说明
refresh() => Void下拉刷新被触发时触发(下拉手势或调用 refresh 方法),App 端与 refresherrefresh 同步触发
scrolltoupper(e: UniScrollToUpperEvent) => Void滚动到顶部时触发,同时内部复位下拉刷新条(App 端)
scrolltolower(e: UniScrollToLowerEvent) => Void滚动到底部时触发,开启 loadmore 时自动触发加载(App 端)
scroll(e: UniScrollEvent) => Void滚动时触发(App 端)
scrollend(e: UniScrollEvent) => Void滚动结束时触发(App 端)
refresherpulling(e: UniRefresherEvent) => Void下拉刷新控件被下拉时触发(App 端)
refresherrefresh(e: UniRefresherEvent) => Void下拉刷新被触发时触发(App 端)
refresherrestore(e: UniRefresherEvent) => Void下拉刷新被复位时触发(App 端)
refresherabort(e: UniRefresherEvent) => Void下拉刷新被中止时触发(App 端)
loadmore() => Void触底或点击加载状态条时触发,仅在开启 loadmore 且状态为 loadmore 时生效,触发后状态自动变为 loading(App / Web 端均生效)

方法

名称参数返回值描述
scrollTotop: Number, left: Number(默认 0)-滚动到指定位置(单位 px),Web 端带平滑动画
refresh--主动触发下拉刷新,进入刷新中状态并置位 refresher-triggered,同时触发 refresh 事件
stopRefresh--结束下拉刷新,恢复可下拉状态并复位 refresher-triggered
loadMore--主动触发一次加载更多(等同触底效果)
registerBacktopupdate: (scrollTop: Number) => Void-注册滚动位置更新回调,供 sn-backtop 绑定(一般无需手动调用)

插槽

名称说明
default作用域插槽,渲染每一条数据,作用域参数:item(当前数据项)、index(当前索引);App 端同 type 数据项共用此模板复用回收

使用 MIT 协议