Skip to content

DrawerList 抽屉长列表

基础用法

  • 抽屉长列表组件,它与 Drawer 组件的底层实现机制完全不同,主要是为了解决 Drawer 内嵌长列表嵌套滚动与手势事件冲突的问题。它内置 sn-list-view 长列表,适合在 Drawer 中展示大量数据的场景(如播放列表、消息列表、评论区)。
  • 弹出层类组件,必须直接放在 sn-page 根节点下使用,否则主题颜色与动画时长等 CSS 变量无法作用到组件内部。
  • 通过 ref 调用 open / close 方法控制显隐;list 配置列表数据,配合作用域插槽渲染每一项(插槽暴露 itemindex)。
  • 滚动与拖拽智能切换:列表未滚动到顶部时可正常滚动内容;列表在顶部时继续下滑,面板跟随手势移动,松手超过 slideHeight 阈值或快速下滑即关闭,未达阈值回弹。Web 端同时支持鼠标拖拽。
  • 面板仅支持底部滑出;height 支持百分比(如 50% 表示占视口高度一半)。
  • 加载更多与下拉刷新:loadmore 开启加载更多(配合 v-model:loadmore-status@loadmore),refresher-enabled 开启下拉刷新(配合 v-model:refresher-triggered),相关配置透传内部 sn-list-view
vue
<template>
	<sn-page>
		<sn-button text="打开抽屉列表" type="primary" @click="open"></sn-button>
		<sn-drawer-list ref="drawerRef" :list="items">
			<template v-slot:default="slotProps">
				<view class="item">
					<text class="item-text">{{ slotProps.item }}</text>
				</view>
			</template>
		</sn-drawer-list>
	</sn-page>
</template>

<script lang="uts" setup
const drawerRef = ref<SnDrawerListComponentPublicInstance | null>(null)
const items = ref<any[]>([])
for (let i = 1; i <= 50; i++) {
	items.push(`列表项目 ${i}`)
}

function open(): void {
	drawerRef.value?.$callMethod('open')
}
</script>

更多演示请下载 demo 查看

加载更多

开启 loadmore 后,列表滚动到底部触发 loadmore 事件,通过 v-model:loadmore-status 控制底部加载状态。

vue
<template>
	<sn-drawer-list ref="drawerRef" :list="items" :loadmore="true"
		v-model:loadmore-status="loadmoreStatus" @loadmore="onLoadmore">
		<template v-slot:default="slotProps">
			<view class="item">
				<text class="item-text">{{ slotProps.item }}</text>
			</view>
		</template>
	</sn-drawer-list>
</template>

<script lang="uts" setup>

const drawerRef = ref<SnDrawerListComponentPublicInstance | null>(null)
const loadmoreStatus = ref<string>('loadmore')

function onLoadmore(): void {
	setTimeout((): void => {
		loadmoreStatus.value = 'nomore'
	}, 800)
}
</script>

抽屉面板属性

参数说明类型默认值可选值
list列表数据数组Array<any>[]-
renderMode渲染模式,v-if 关闭后销毁内容,v-show 保留内容Stringv-ifv-if | v-show
showLine是否显示面板上的滑动指示条Booleantruetrue | false
slideClose是否启用滑动关闭手势Booleantruetrue | false
height面板高度,支持百分比String | Number300px-
slideHeight滑动关闭阈值,面板下滑距离达到阈值则关闭String | Number100px-
bgColor面板背景颜色,支持 $ 简写String$front-
lineColor滑动指示条颜色,支持 $ 简写String$lineText-
padding面板内边距String25px 15px 10px 15px-
borderRadius面板圆角大小,支持 $ 简写,为空时随圆角乘数自动计算String | Number''-
aniTime显示 / 关闭动画时长(ms),支持 $ 简写,为空时取框架动画长时长String | Number''-
preventBack显示时是否阻止页面返回事件Booleanfalsetrue | false
maskClose是否启用点击遮罩关闭Booleantruetrue | false
maskOpacity遮罩透明度Number0.3-
zIndex弹出层层级Number999-
customStyle自定义面板样式UTSJSONObject | String''-
v-model:refresher-triggered下拉刷新状态绑定值Booleanfalsetrue | false
v-model:loadmore-status加载更多状态绑定值Stringloadmoreloadmore | loading | nomore

透传 sn-list-view 属性

以下属性透传给内部 sn-list-view,用于控制列表滚动、回弹、下拉刷新与回到顶部等行为。

参数说明类型默认值可选值
bouncesiOS 下是否支持回弹Booleantruetrue | false
nested是否使用嵌套滚动模式Booleanfalsetrue | false
customNestedScroll是否使用自定义嵌套滚动处理Booleanfalsetrue | false
upperThreshold距顶部多远时触发 scrolltoupper 事件(px)Number50-
lowerThreshold距底部多远时触发 scrolltolower 事件(px)Number50-
scrollTop设置竖向滚动位置Number0-
scrollLeft设置横向滚动位置Number0-
showScrollbar是否显示滚动条Booleantruetrue | false
scrollIntoView滚动到指定子元素(值为元素 id)String''-
scrollWithAnimation滚动位置变化时是否使用滚动动画Booleantruetrue | false
androidOverscrollAndroid 下是否支持滚动越界Booleanfalsetrue | false
androidScrollbarDraggable滚动条是否可拖拽(仅 Android)Booleanfalsetrue | false
enableBackToTop点击顶部状态栏回到顶部(仅 iOS)Booleanfalsetrue | false
scrollAnchoring是否开启滚动锚定(仅 Web)Booleanfalsetrue | false
nestedScrollChild嵌套滚动的子容器 idString''-
listPadding列表内边距Array<Number>[]-
refresherEnabled是否开启下拉刷新Booleanfalsetrue | false
refresherThreshold下拉刷新触发阈值(px)Number45-
refresherMaxDragDistance下拉刷新最大拖拽距离(px),0 表示不限制Number0-
refresherBackground下拉刷新区域背景颜色,支持 $ 简写Stringtransparent-
refresherDefaultStyle下拉刷新默认样式Stringwhitewhite | black | none
enablePassive是否启用被动滚动模式(仅 Web 默认为 true,其余平台为 falseBoolean见说明true | false
backtop是否显示回到顶部按钮Booleanfalsetrue | false
backtopTarget回到顶部滚动目标元素 idString''-
backtopTop回到顶部按钮距顶部距离(px)Number400-
backtopRight回到顶部按钮距右侧距离(px)Number30-
backtopBottom回到顶部按钮距底部距离(px)Number100-
loadmore是否开启加载更多Booleanfalsetrue | false
loadmoreConfig加载更多样式配置SnLoadmoreParams{}-
refresherConfig下拉刷新样式配置SnRefresherParams{}-
listStyle自定义列表样式UTSJSONObject | String''-
listClass列表外部类String''-

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

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

事件

名称类型说明
clickoverlay() => Void点击遮罩时触发
beforeenter() => Void入场动画开始前触发
enter() => Void入场动画开始时触发
afterenter() => Void入场动画结束后触发
beforeleave() => Void离场动画开始前触发
leave() => Void离场动画开始时触发
afterleave() => Void离场动画结束后触发
scrolltoupper(ev: UniScrollToUpperEvent) => Void列表滚动到顶部时触发
scrolltolower(ev: UniScrollToLowerEvent) => Void列表滚动到底部时触发
scroll(ev: UniScrollEvent) => Void列表滚动时触发
scrollend(ev: UniScrollEvent) => Void列表滚动结束时触发
refresherpulling(ev: UniRefresherEvent) => Void下拉刷新被拉动时触发
refresherrefresh(ev: UniRefresherEvent) => Void下拉刷新被触发时触发
refresherrestore(ev: UniRefresherEvent) => Void下拉刷新被复位时触发
refresherabort(ev: UniRefresherEvent) => Void下拉刷新被中止时触发
loadmore() => Void列表滚动到底部且 loadmore 开启时触发
click() => Void列表区域被点击时触发

方法

名称参数返回值描述
open--打开抽屉
close--关闭抽屉

插槽

名称说明
default列表项内容的作用域插槽,暴露 item(当前项数据)与 index(当前项索引)
prefix列表上方的内容区,位于 sn-list-view 之前,不随列表滚动
suffix列表下方的内容区,位于 sn-list-view 之后,不随列表滚动

使用 MIT 协议