# coolui-scroller · 完整文档(LLM 单文件版)
> coolui-scroller 是一个专注小程序「下拉刷新 / 上拉加载 / 长列表」的组件库,提供两个 npm 包:
>
> - 原生微信小程序版 `coolui-scroller`(微信原生项目)
> - uni-app 版 `coolui-scroller-uni`(Vue 2 / Vue 3,可编译到微信 / 支付宝 / 百度 / 字节 / QQ 小程序及 H5、App)
>
> 两个版本的**组件能力与配置项一致**,差别只在引入方式与个别平台写法。
>
> 文档站:https://wzs28150.github.io/coolui-scroller/v4/ | 仓库:https://github.com/wzs28150/coolui-scroller
>
> 本文件由 `scripts/build-llms.mjs` 依据 `doc/` 下的 Markdown 文档自动生成,请勿手工编辑;修改文档后执行 `pnpm docs:llms` 重新生成。
## 目录
- **一、通用:这是什么、怎么安装**
- [coolui-scroller 组件库介绍](https://wzs28150.github.io/coolui-scroller/v4/native/guide)
- [原生微信小程序版:安装与引入](https://wzs28150.github.io/coolui-scroller/v4/native/install)
- **二、原生微信小程序版(coolui-scroller)组件**
- [Scroller 滚动组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/scroller)
- [Item 列表项组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/item)
- [ScrollPage 长列表分页组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/page)
- [Empty 空列表组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/empty)
- [Handtip 手势提示组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/handtip)
- [Loadmore 加载更多组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/loadmore)
- [Refresh 下拉刷新组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/refresh)
- [Parallax 下拉视差组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/parallax)
- [Nav 分类导航组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/nav)
- [NavPannel 切换组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/navPannel)
- [Search 搜索组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/search)
- [Sort 排序及分类筛选组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/sort)
- [SecondFloor 下拉二楼组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/floor)
- [BackToTop 回到顶部组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/backToTop)
- **三、uni-app 版(coolui-scroller-uni):安装与快速开始**
- [uni-app 版:安装与引入](https://wzs28150.github.io/coolui-scroller/v4/uniapp/install)
- [uni-app 版:快速开始](https://wzs28150.github.io/coolui-scroller/v4/uniapp/quickstart)
- [uni-app 版:与原生版的差异](https://wzs28150.github.io/coolui-scroller/v4/uniapp/platform-diff)
- **四、uni-app 版组件**
- [uni-app 组件总览与命名对照](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/)
- [Scroller 滚动容器](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/scroller)
- [Item 列表项组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/item)
- [Longlist 长列表窗口化容器(推荐)](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/longlist)
- [Page 长列表分页(旧方案)](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/page)
- [Empty 空列表组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/empty)
- [Handtip 手势提示组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/handtip)
- [Loadmore 加载更多组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/loadmore)
- [Refresh 下拉刷新组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/refresh)
- [Parallax 下拉视差组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/parallax)
- [Nav 分类导航组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/nav)
- [NavBar 顶部导航栏](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/navBar)
- [NavPannel 切换组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/navPannel)
- [Search 搜索组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/search)
- [Sort 排序及分类筛选组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/sort)
- [SecondFloor 下拉二楼组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/floor)
- [BackToTop 回到顶部组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/backToTop)
- **五、进阶:常见问题**
- [常见问题 FAQ](https://wzs28150.github.io/coolui-scroller/v4/advanced/faq)
# 一、通用:这是什么、怎么安装
## coolui-scroller 组件库介绍
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/native/guide | 来源:`doc/native/guide.md`
coolui-scroller 是一个专注小程序**下拉刷新 / 上拉加载 / 长列表**的组件库,提供[原生微信小程序版](https://wzs28150.github.io/coolui-scroller/v4/native/install)与 [uni-app 版](https://wzs28150.github.io/coolui-scroller/v4/uniapp/install)两套实现,组件能力与配置项一致。
### 前言
#### 初衷
本来写这个组件的初衷,是在我写了一个小程序之后,发现小程序如果要实现下拉刷新、上拉加载有两种方式:
1. 页面级的:利用页面 Page 里提供的方法。下拉虽说是那个东西但是它只有下拉三个点的动画效果而且只能显示在头部就很尴尬。很多时候一个列表的头部往往会有一些组件比如搜索、分类导航等等。所以往往列表都是局部的非页面级的。这时候下拉时动画出现在最顶部就显得很突兀。
```javascript
Page({
onPullDownRefresh: function () {
// 监听用户下拉刷新事件。
},
onReachBottom: function () {
// 监听用户上拉触底事件。
},
onPageScroll: function () {
// 监听用户滑动页面事件。
},
})
```
2. 组件级的:利用 scroll-view。 但是当你打开 scroll-view 官方文档时,映入眼帘的是一列列的参数属性方法。要完全弄懂里面的内容,恐怕你得上手写写,挨个试试里面的参数和方法才行。而对于下拉刷新这个效果文档上有个简易的 demo 可寻。上拉加载也只有 bindscrolltolower 这么个方法和 lower-threshold 阈值。所以要实现起来完全还得靠自己。
所以在写项目的最后我把页面的列表下拉刷新,上拉加载进行了初步的封装。单独拿出来方便之后重复使用。所以有了起初的 1.0 版。
#### 发展
##### V2.0
scroll-view 组件初期并没有那么多配置,所以 1.0 实现的效果很有限。
后来随着官方 scroll-view 组件的不断的更新。增加了很多新的属性和事件使得下拉可以自定义起来。虽然也有很多地方不尽人意,但是可玩度还是有很多的。所以又升级了 2.0 版增加了很多下拉的自定义动画效果和上拉加载的效果。
2.0 版组件还是围绕着 scroll-view,写法上只有一个封装好的 scroller 组件。内置了一个基础的下拉效果。提供下拉的插槽位置。并给出了几个有趣的下拉效果 demo(如:天猫效果、京东小人效果)让下拉又有了更多的可能性;配置上也考虑了很多增加了列表为空时的设置上拉加载的配置。整个配置就是一个 Obj,细化到文字、背景。
V2.0 配置:
```js
// data 中配置
scroll: {
// 设置分页信息
pagination: {
page: 1,
totalPage: 10,
limit: 10,
length: 100
},
// 设置数据为空时的图片
empty: {
img: 'http://coolui.coolwl.cn/assets/mescroll-empty.png'
},
// 设置下拉刷新
refresh: {
type: 'default',
style: 'black',
background: "#000"
},
// 设置上拉加载
loadmore: {
type: 'default',
icon: 'http://upload-images.jianshu.io/upload_images/5726812-95bd7570a25bd4ee.gif',
background: '#f2f2f2',
// backgroundImage: 'http://coolui.coolwl.cn/assets/bg.jpg',
title: {
show: true,
text: '加载中',
color: "#999",
shadow: 5
}
}
},
```
之后由于疫情及个人原因这个组件搁置了一阵子。当我再次打开它时便有了重构的想法。
##### V3.0
3.0 版打算把之前各个部分的插槽进行细化及拆分。并新增空列表插槽及组件、初次进入程序时的手势提示组件、顶部插槽及顶部插槽可用的组件(如:搜索组件、分类组件、下拉筛选组件)。
除了组件的变化外,核心列表准备加入长列表处理,解决数据量大时列表会出现的问题(如:setData 加载大数据的耗时高、列表渲染出来的 Dom 结构多、占用的内存高,造成页面被系统回收的概率变大等)。起初想以官方给出的 recycle-view 组件进行扩展。但是使用中,遇到很多坑及不方便之处。最让我接受不了的是需要设置 itemSize 这个方法。当我在不确定列表元素宽高的时候就很难设置。后来经过大量的思考和查资料及尝试。决定采用知乎上 daisy 提出的长列表解决方案。
#### v3.0 版
1. 基于小程序原生组件 scroll-view 的扩展与封装,实现简单的上拉加载下拉刷新
2. 扩展下拉刷新动画,有灵感的朋友可以丰富更多下拉动画
3. 上传至 npm 包可安装下载并 npm 构建
4. 修改参数配置使组件使用更便捷
5. 增加加载插槽可以自定义加载更多样式
6. 增加多组件配合使列表功能更丰富
#### 开发进度
1. ~~调整为虚拟长列表模式~~
2. ~~支持多组件搭配,使插件更灵活~~
3. ~~新增组件 coolui-scroller-item(列表项组件)~~
4. ~~新增组件 coolui-scroller-page(长列表分页组件)~~
5. ~~新增组件 coolui-scroller-empty(空列表组件)~~
6. ~~新增组件 coolui-scroller-handtip(手势提示组件)~~
7. ~~新增组件 coolui-scroller-loadmore(加载更多组件)~~
8. ~~新增组件 coolui-scroller-nav(分类导航组件)~~
9. ~~新增组件 coolui-scroller-refresh(下拉刷新组件)~~
10. ~~新增组件 coolui-scroller-parallax(下拉刷新视差位移组件)~~
11. ~~新增组件 coolui-scroller-search(搜索组件)~~
12. ~~新增组件 coolui-scroller-sort(分类筛选及排序组件)~~
13. ~~新增组件 coolui-scroller-floor(下拉二楼组件)~~
### v4.0 版
v4.0.0 有两条主线:**长列表窗口化**,以及**同仓维护的原生 + uni-app 双版本**。
#### 长列表窗口化
v3 的长列表是「每一页都保留一个 `scroll-page` 组件实例,滚出视口后把列表项换成占位」。当加载的页数足够多时,**页结构本身**也会成为卡顿来源:页组件实例与 IntersectionObserver 的数量都会随总页数线性增长。
v4.0.0 把「窗口」从 item 层扩展到 page 层:
- 只真实渲染**窗口内**的页(当前可见页 ± 相邻页),窗口外统一折叠为**上下两个占位块**;
- 页高定位不再使用 IntersectionObserver,改为「滚动距离 + 页高前缀和二分」,复杂度 O(log N);
- 未测量的页用「已测量页的平均值」估算,滚过后测量回填并自动收敛。
| 项目 | v3.x | v4.0.0 |
| --- | --- | --- |
| 页组件实例 | 每一页一个,随总页数增长(O(N)) | 只渲染窗口内的页,约 3~5 个(O(窗口)) |
| 页高定位 | 每页一个 IntersectionObserver(N 个观察者) | 滚动距离 + 页高前缀和二分,**0 个观察者** |
| 窗口外节点 | 每页一个占位节点(N 个) | 折叠为**上下两个**占位块 |
| 窗口重算 | 由观察者回调触发 | 滚动时按需重算,O(log N) |
页数越多收益越明显:加载 50 页时,节点数由「50 个页组件 + 50 个观察者」降为「约 5 个页组件 + 2 个占位块」。
具体写法与升级对照见 [ScrollPage 长列表分页组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/page)。
### uni-app 版
从 v4 开始,组件库以**同仓双版本**的形式维护:原生微信小程序版(npm 包 `coolui-scroller`)与 uni-app 版(npm 包 `coolui-scroller-uni`)。两者**组件能力与配置项保持一致**,文档一一对应,用站点顶部的切换器可以随时对照另一端的写法。
uni-app 版不是原生版的简单搬运,写法上按 Vue 的习惯重新实现:
| 项 | 原生微信小程序版 | uni-app 版 |
| --- | --- | --- |
| 组件通信 | 小程序 `relations` 关联父子组件 | Vue `provide/inject` |
| 事件 | `bind:xxx` | `@xxx`;受控属性 `@update:propName`(可写 `v-model:xxx`) |
| 引入方式 | `usingComponents` | easycom 免 import,也支持全局注册 / 页面内局部引入 |
| 长列表 | `scroll-page` 窗口化渲染 | 新增 `coolui-scroller-longlist`(窗口化容器,推荐) |
| 类型 | — | 组件用 `
```
### TypeScript 支持
组件用 `PropType` 精确标注了 props,并给 `defineEmits`、`provide/inject` 的通信 API 补了类型,编辑器(Volar / vue-tsc)可获得完整提示。公共类型集中在 `types.d.ts`,可直接引入:
```ts
import type {
CooluiScrollerProps,
CooluiScrollerRefreshProps,
CooluiRefreshConfig,
CooluiSortOption,
} from 'coolui-scroller-uni/types'
```
> 写模板时有补全和中文提示
安装[编辑器插件](https://wzs28150.github.io/coolui-scroller/v4/advanced/plugin)后,`.vue` 的 `` 里组件标签、属性(`:prop`)、事件(`@event`)、具名插槽(`#slot`)都会自动补全,悬停可看中文说明。
### 组件清单
见 [组件总览 / 命名对照](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/),里面有原生微信小程序版与 uni-app 版的标签对照表。
### 示例工程
仓库里的 `demo/uniapp` 是 Vue3 + Vite 的示例工程(已配置 easycom 与自动导入,可直接作为接入参考):
```bash
pnpm install
pnpm --filter demo-uniapp build:mp-weixin # 编译到微信小程序
pnpm --filter demo-uniapp dev:mp-weixin # 开发模式(watch)
```
编译后用微信开发者工具打开 `demo/uniapp/dist/build/mp-weixin` 预览;App 端用 `npm run build:app` 生成资源包,再用 HBuilderX 打包。
### 下一步
- [快速开始](https://wzs28150.github.io/coolui-scroller/v4/uniapp/quickstart):最小可运行的下拉刷新 + 上拉加载
- [与原生微信小程序版的差异](https://wzs28150.github.io/coolui-scroller/v4/uniapp/platform-diff):事件命名、通信方式,以及 H5 / 小程序 / App 各端的坑
- [编辑器插件](https://wzs28150.github.io/coolui-scroller/v4/advanced/plugin):Vue 模板里的组件补全、悬停文档
---
## uni-app 版:快速开始
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/quickstart | 来源:`doc/uniapp/quickstart.md`
这里是最小可运行的「下拉刷新 + 上拉加载」示例,直接拷进页面即可跑起来(配合 [安装与引入](https://wzs28150.github.io/coolui-scroller/v4/uniapp/install) 的 easycom 配置)。
### 页面代码
```vue
{{ item }}
```
### 关键点
| 点 | 说明 |
| --- | --- |
| `@refresh` / `@loadmore` | 原生微信小程序版的 `bind:refresh` 在这里写成 `@refresh`(Vue 事件绑定) |
| `#refresh` / `#loadmore` | 插槽名与原生微信小程序版一致,保持组件嵌套层级即可,无需额外配置 |
| `getList` 返回 promise | 组件按 promise 结束刷新/加载流程,返回前不要提前 resolve,否则动画会提前收起 |
| `:isEmpty` | 数据为空时显示空态,配合 `coolui-scroller-empty` 自定义空列表 |
### 长列表
数据量大时不要直接渲染全部节点,用长列表组件:
- `coolui-scroller-longlist`:**推荐**,窗口化方案 —— 窗口外的内容折叠为上下占位块,渲染的节点数与总页数无关。
- `coolui-scroller-page`:旧方案,按页整页占位。
完整用法见示例工程 `demo/uniapp/src/pages/longlist/index.vue`,组件说明见 [组件总览](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/#coolui-scroller-longlist)。
### 两个高频坑
1. **下拉手感发硬、没有弹性**:把刷新配置的 `background.height` 设得比 `height` 大(例如 `height: 50`、`background.height: 120`),松手才会先回落到刷新高度显示动画、完成后再整体回弹。详见 [常见问题](https://wzs28150.github.io/coolui-scroller/v4/advanced/faq#下拉刷新没有弹性回弹感)。
2. **H5 上出现页面级滚动条**:全屏页写 `height: 100vh` 没扣掉 H5 内置导航栏,改成 `calc(100vh - var(--window-top))`。详见 [跨端差异](https://wzs28150.github.io/coolui-scroller/v4/uniapp/platform-diff#h5-内置导航栏会额外占高)。
---
## uni-app 版:与原生版的差异
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/platform-diff | 来源:`doc/uniapp/platform-diff.md`
uni-app 版(`coolui-scroller-uni`)的组件能力、交互效果与原生微信小程序版保持一致,**props 与配置项可直接对照原生微信小程序版文档**。差异集中在下面两类:与原生微信小程序版的写法差异、各端(小程序 / H5 / App)的运行差异。
### 一、与原生微信小程序版的写法差异
| 项 | 原生微信小程序版 | uni-app 版 |
| --- | --- | --- |
| 组件标签 | `scroller`、`refresh`、`item`…(可自定义 tag 名) | 统一 `coolui-scroller-*` 前缀,如 `coolui-scroller-refresh` |
| 事件 | `bind:refresh` / `bind:loadmore` | `@refresh` / `@loadmore` |
| 受控属性 | 直接改 data | 通过 `@update:propName` 同步,如 sort-item 的 `@update:value` |
| 保留字属性 | search 组件用 `key` | 改名为 `keyword`,用 `@update:keyword` 同步 |
| 组件通信 | 小程序 `relations` 关联父子组件 | Vue `provide/inject` |
| 长列表 | `scroll-page`(整页占位) | `coolui-scroller-page`(旧方案)+ `coolui-scroller-longlist`(窗口化,推荐) |
| 类型 | — | `.vue` + `types.d.ts`,可 `import type { CooluiScrollerProps } from 'coolui-scroller-uni/types'` |
需要在组件之间通信的嵌套关系(保持层级即可,无需手动配置):
- `coolui-scroller` → `coolui-scroller-refresh` / `coolui-scroller-back-to-top`
- `coolui-scroller-refresh` → `coolui-scroller-parallax`
- `coolui-scroller-nav-pannel` → `coolui-scroller`
- `coolui-scroller-sort` → `coolui-scroller-sort-item`
- `coolui-scroller-second-floor` → `coolui-scroller-second-floor-refresh` / `coolui-scroller-nav-bar`
### 二、各端运行差异
#### H5 内置导航栏会额外占高
uni-app 在 H5 端会额外渲染内置导航栏(高度就是 CSS 变量 `--window-top`,默认 44px),而 `pages.json` 里的 `disableScroll` **只在小程序端生效**。于是全屏页写 `height: 100vh` 时会比可视区高出一截,出现页面级滚动条(小程序端一直正常,所以就容易漏)。
```scss
/* #ifdef H5 */
.page {
height: calc(100vh - var(--window-top, 0px) - var(--window-bottom, 0px));
}
/* #endif */
```
- 用 `--window-top` / `--window-bottom`(tabbar)而不是写死 44px;默认值 `0px` 兜底,变量缺失时不会反向变矮。
- `#ifdef H5` 包裹后,这段样式在小程序 / App 端构建时会被剥离,行为不变。
- 自定义导航栏(`navigationStyle: custom`)的页面 `--window-top` 为 0,无需处理。
#### 插槽与样式作用域
小程序端组件插槽**不是作用域插槽**,且页面里 `scoped` 样式穿不进组件插槽。所以:
- 页面里给插槽内容写样式时,选择器要落在插槽内容本身(例如给内容加自己的 class),不要指望 `.coolui-scroller .item` 这类跨组件选择器;
- 若要统一列表项间距、内边距,写在组件/列表项自身的样式上,或给插槽内容加 class 后再写。
#### 下拉刷新动画与「原生效果」
`type: 'default'` 会走小程序原生的下拉样式(三个圆点动画)。**同一个组件、同一个 type,两个页面观感不同,多半是刷新配置不一致**:`background.height`(下拉行程)大于 `height`(刷新自身高度)时,松手先回落到 `height` 显示加载动画、刷新完成后再整体回弹,也就是「两段回弹」的弹性感;不设置时行程很快就饱和,只剩单段回弹,手感偏硬。
#### App 端
组件按源码参与编译,App 端与小程序端表现一致;H5 的高度处理同样适用于 App 端内嵌 WebView 的场景。App 资源包用 `npm run build:app` 产出,安装包需要在 HBuilderX 里云打包生成。
### 相关阅读
- [常见问题](https://wzs28150.github.io/coolui-scroller/v4/advanced/faq):下拉没弹性、页面滚动条、列表间距等
- [安装与引入](https://wzs28150.github.io/coolui-scroller/v4/uniapp/install) / [快速开始](https://wzs28150.github.io/coolui-scroller/v4/uniapp/quickstart)
---
# 四、uni-app 版组件
## uni-app 组件总览与命名对照
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/ | 来源:`doc/uniapp/components/index.md`
uni-app 版组件与原生微信小程序版一一对应,能力与配置项一致;**标签统一加 `coolui-scroller-` 前缀**,个别组件的保留字属性做了改名(详见[与原生微信小程序版的差异](https://wzs28150.github.io/coolui-scroller/v4/uniapp/platform-diff))。
### 命名对照表
| 功能 | uni-app 标签 | 原生微信小程序(目录) | 文档 |
| --- | --- | --- | --- |
| 滚动容器 | `coolui-scroller` | `coolui-scroller/scroller/index` | [文档](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/scroller) |
| 列表项(水波纹) | `coolui-scroller-item` | `coolui-scroller/item/index` | [文档](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/item) |
| 长列表窗口化(推荐) | `coolui-scroller-longlist` | 原生无同名组件(对应 `scroll-page` 的思路) | [文档](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/longlist) |
| 长列表分页(旧方案) | `coolui-scroller-page` | `coolui-scroller/scroll-page/index` | [文档](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/page) |
| 空列表占位 | `coolui-scroller-empty` | `coolui-scroller/empty/index` | [文档](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/empty) |
| 手势提示 | `coolui-scroller-handtip` | `coolui-scroller/handtip/index` | [文档](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/handtip) |
| 加载更多 | `coolui-scroller-loadmore` | `coolui-scroller/loadmore/index` | [文档](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/loadmore) |
| 下拉刷新 | `coolui-scroller-refresh` | `coolui-scroller/refresh/index` | [文档](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/refresh) |
| 下拉视差 | `coolui-scroller-parallax` | `coolui-scroller/parallax/index` | [文档](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/parallax) |
| 分类导航 | `coolui-scroller-nav` | `coolui-scroller/nav/index` | [文档](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/nav) |
| 顶部导航栏 | `coolui-scroller-nav-bar` | `coolui-scroller/nav-bar/index`(原生无独立文档页) | [文档](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/navBar) |
| 切换容器 | `coolui-scroller-nav-pannel` | `coolui-scroller/nav-pannel/index` | [文档](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/navPannel) |
| 搜索框 | `coolui-scroller-search`(属性是 `keyword`) | `coolui-scroller/search/index` | [文档](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/search) |
| 排序筛选 | `coolui-scroller-sort` / `coolui-scroller-sort-item` | `coolui-scroller/sort/index` + `coolui-scroller/sort/item` | [文档](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/sort) |
| 下拉二楼 | `coolui-scroller-second-floor` / `coolui-scroller-second-floor-refresh` | `coolui-scroller/second-floor/index`(+ `second-floor-refresh`) | [文档](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/floor) |
| 回到顶部 | `coolui-scroller-back-to-top` | `coolui-scroller/backToTop/index` | [文档](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/backToTop) |
### 公共约定
- **引入**:配好 [easycom](https://wzs28150.github.io/coolui-scroller/v4/uniapp/install#方式一easycom推荐) 后直接写标签,无需 `import`;也可全局注册或页面内局部引入。
- **事件**:原生 `bind:xxx` 在这里写成 `@xxx`;受控属性通过 `@update:propName` 同步,可简写为 `v-model:propName`。
- **插槽**:插槽名与原生一致(`#header`、`#refresh`、`#empty`、`#loadmore`、`#backToTop` 等),保持组件的**嵌套层级**即可,无需额外配置。
- **组件通信**:原生用 `relations` 自动关联父子组件,uni-app 版改为 Vue `provide/inject`,所以层级关系不要打乱。
- **样式**:原生 `externalClasses` 在这里换成 `virtualHost + apply-shared`,页面里覆盖组件内部样式请用 `:deep(...)`。
- **类型**:公共类型集中在 `types.d.ts`,可 `import type { CooluiScrollerProps, CooluiRefreshConfig } from 'coolui-scroller-uni/types'`。
各组件详细属性与示例见左侧「组件」下的独立页面。
---
## Scroller 滚动容器
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/scroller | 来源:`doc/uniapp/components/scroller.md`
`` 是列表能力的底座:下拉刷新 / 上拉加载 / 空列表 / 回到顶部都通过它的插槽接入。
> 对应原生微信小程序版:[Scroller 滚动组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/scroller);写法差异见[与原生微信小程序版的差异](https://wzs28150.github.io/coolui-scroller/v4/uniapp/platform-diff)。
### 代码演示
**组合式 API**
```vue
{{ item.title }}
```
**选项式 API**
```vue
{{ item.title }}
```
### 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| isEmpty | 数据为空态,渲染 `empty` 插槽 | _Boolean_ | `false` |
| background | 背景色(保留字段,组件内部未使用,与原生一致) | _String_ | `#f2f2f2` |
| isBackBtn | 兼容字段,回到顶部按钮的显隐实际由 back-to-top 组件注册决定 | _Boolean_ | `false` |
| enableFlex | 透传给 `scroll-view` 的 `enable-flex` | _Boolean_ | `false` |
| toView | 滚动到指定元素 id(`scroll-into-view`) | _String_ | `''` |
| top | 滚动位置,支持 `v-model:top` | _Number_ | `0` |
| animation | 滚动是否带过渡动画 | _Boolean_ | `true` |
### 事件
| 事件 | 说明 | 参数 |
| --- | --- | --- |
| refresh | 下拉刷新触发 | — |
| loadmore | 上拉触底触发 | — |
| restore | 刷新流程结束(回弹完成) | — |
| contentHeight | 内容高度变化 | `height: number` |
| update:top | 滚动位置变化(配 `v-model:top`) | `top: number` |
| scroll | 滚动中,常用于长列表 | `event`(原始滚动事件对象) |
### 插槽
| 插槽 | 说明 |
| --- | --- |
| header | 列表顶部(不参与滚动区域) |
| refresh | 下拉刷新组件位置 |
| 默认 | 列表内容 |
| empty | 空列表内容,`isEmpty` 为 true 时显示 |
| loadmore | 加载更多位置 |
| backToTop | 回到顶部按钮位置 |
### 与原生版的差异
- 组件通信由原生 `relations` 改为 `provide/inject`,**父子层级不要打乱**;
- 新增 `v-model:top`(`update:top` 事件),原生没有;
- `scroll` 事件透传原始滚动事件对象,原生只透出 `{ scrollTop }`。
### 相关
- [Refresh 下拉刷新组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/refresh) · [Loadmore 加载更多组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/loadmore) · [Empty 空列表组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/empty)
- [快速开始](https://wzs28150.github.io/coolui-scroller/v4/uniapp/quickstart):最小可运行示例
---
## Item 列表项组件
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/item | 来源:`doc/uniapp/components/item.md`
`` 是列表项容器,自带点击水波纹。
> 对应原生微信小程序版:[Item 列表项组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/item)
### 代码演示
**组合式 API**
```vue
{{ index }}.{{ item.title }}
```
**选项式 API**
```vue
{{ index }}.{{ item.title }}
```
### 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| ripple | 点击是否开启水波纹 | _Boolean_ | `false` |
### 插槽
| 插槽 | 说明 |
| --- | --- |
| 默认 | 列表项内容 |
### 与原生版的差异
- 属性一致(只有 `ripple`);
- 水波纹动画名由 `ripple` 改为 `coolui-ripple`,如果页面里自定义过动画名需要注意。
### 相关
- [Scroller 滚动容器](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/scroller) · [Longlist 长列表窗口化](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/longlist)
---
## Longlist 长列表窗口化容器(推荐)
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/longlist | 来源:`doc/uniapp/components/longlist.md`
`` 是 uni-app 版**新增**的长列表容器(原生侧没有同名组件):窗口外的内容折叠为上下占位块,**渲染的节点数与总页数无关**,数据量大时比整页占位更稳。
> 新项目建议用它;旧方案见 [Page 长列表分页](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/page)。
### 代码演示
**组合式 API**
```vue
{{ pageIndex }} - {{ item.title }}
```
**选项式 API**
```vue
{{ pageIndex }} - {{ item.title }}
```
### 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| pages | 分页数据,`pages[pageIndex]` 为该页的 item 数组 | _Array_ | `[]` |
| heights | 初始页高缓存(已测量过的页高,避免首次渲染跳动) | _Array_ | `[]` |
| scrollTop | 当前滚动距离,由 `scroller` 的 `@scroll` 透传 | _Number_ | `0` |
| overscan | 窗口前后各多渲染几页 | _Number_ | `1` |
| estimateHeight | 未测量页的估算高度(`0` 时取已测量页的均值,兜底 300) | _Number_ | `0` |
### 插槽
| 插槽 | 说明 |
| --- | --- |
| page | **作用域插槽**,参数 `{ items, pageIndex }`,渲染单页内容 |
### 使用要点
1. `pages` 是**二维数组**(页 → items),不是扁平列表;
2. 必须把 `coolui-scroller` 的 `@scroll` 传给 `scroll-top`,否则无法判断窗口;
3. 每页内容高度尽量一致,`estimateHeight` 与实际差得越多,滚动条长度就越不准;
4. 与滚动容器嵌套层级保持不变即可,组件之间通过 `provide/inject` 通信。
### 相关
- [Page 长列表分页(旧方案)](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/page)
- [原生微信小程序版的长列表](https://wzs28150.github.io/coolui-scroller/v4/native/components/page):`scroll-page` 按页整页占位
---
## Page 长列表分页(旧方案)
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/page | 来源:`doc/uniapp/components/page.md`
`` 是长列表分页的旧方案:**按页整页占位**,未渲染的页用等高占位块撑起高度,减少同时存在的节点数。
> 新项目建议使用 [Longlist 长列表窗口化](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/longlist)(窗口外折叠为上下占位块,节点数与总页数无关)。
### 代码演示
**组合式 API**
```vue
{{ item.title }}
```
**选项式 API**
```vue
{{ item.title }}
```
### 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| pageList | 当前页的数据;只给了 `height` 时渲染为占位块 | _Array_ | `[]` |
### 插槽
| 插槽 | 说明 |
| --- | --- |
| 默认 | 单页内容(一般放若干 `coolui-scroller-item`) |
### 与原生版的差异
- 属性与原生 `scroll-page` 的 `pageList` 一致;
- 原生侧需要额外引入组件提供的方法来计算每页高度(见[原生长列表文档](https://wzs28150.github.io/coolui-scroller/v4/native/components/page#代码演示)),uni-app 版由 [Longlist](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/longlist) 承担窗口计算,**优先用 Longlist**。
### 相关
- [Longlist 长列表窗口化(推荐)](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/longlist)
---
## Empty 空列表组件
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/empty | 来源:`doc/uniapp/components/empty.md`
`` 提供空数据时的占位内容,放在 `coolui-scroller` 的 `empty` 插槽里,`isEmpty` 为 `true` 时显示。
> 对应原生微信小程序版:[Empty 空列表组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/empty)
### 代码演示
**组合式 API**
```vue
```
**选项式 API**
```vue
```
### 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| emptyImg | 空列表图片地址 | _String_ | `''` |
| emptyText | 空列表文字 | _String_ | `'暂无内容'` |
### 与原生版的差异
原生侧用外部样式类 `img-class` / `text-class` 定制图片与文字样式;uni-app 版没有外部样式类,页面里用 `:deep()` 覆盖组件内部类名即可:
```scss
.empty {
:deep(.empty-img) {
width: 240rpx;
}
:deep(.empty-text) {
color: #999;
}
}
```
### 相关
- [Scroller 滚动容器](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/scroller) · [Loadmore 加载更多组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/loadmore)
---
## Handtip 手势提示组件
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/handtip | 来源:`doc/uniapp/components/handtip.md`
`` 用于第一次进入时提示用户「下拉刷新 / 上拉加载」等手势,看过一次后不再出现(用 `storageKey` 记录)。
> 对应原生微信小程序版:[Handtip 手势提示组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/handtip)
### 代码演示
**组合式 API**
```vue
```
**选项式 API**
```vue
```
### 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| top | 顶部提示文字 | _String_ | `''` |
| bottom | 底部提示文字 | _String_ | `''` |
| left | 左侧提示文字 | _String_ | `''` |
| right | 右侧提示文字 | _String_ | `''` |
| storageKey | 记录"已提示过"的 storage key,换 key 可让提示重新出现 | _String_ | `'isTipShow'` |
| opacity | 遮罩透明度 | _Number_ | `0.5` |
### 事件
| 事件 | 说明 | 参数 |
| --- | --- | --- |
| close | 提示关闭时触发 | — |
### 与原生版的差异
- **属性改名**:原生用 `key`(Vue 中的保留字),uni-app 版改为 **`storageKey`**,默认值同为 `'isTipShow'`;
- 新增 `close` 事件(原生没有);
- `top` / `bottom` / `left` / `right` 原生默认 `0`,uni-app 版默认 `''`(不显示对应方向的文字)。
---
## Loadmore 加载更多组件
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/loadmore | 来源:`doc/uniapp/components/loadmore.md`
`` 展示上拉加载的状态与文案,放在 `coolui-scroller` 的 `loadmore` 插槽里。
> 对应原生微信小程序版:[Loadmore 加载更多组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/loadmore)
### 代码演示
**组合式 API**
```vue
{{ item.title }}
```
**选项式 API**
```vue
{{ item.title }}
```
### 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| status | 当前状态:`more` / `loading` / `noMore` | _String_ | `'more'` |
| loading | 加载中状态的文字与颜色 | _Object_ | `{ text: '加载中', color: '#999999' }` |
| more | 可上拉状态的文字与颜色 | _Object_ | `{ text: '查看更多', color: '#333333' }` |
| noMore | 没有更多状态的文字与颜色 | _Object_ | `{ text: '没有更多', color: '#999999' }` |
| color | 兼容字段 | _String_ | `'#999999'` |
| shake | 兼容字段 | _Boolean_ | `false` |
### 与原生版的差异
- 原生还有一个 `noMoreTextStyle` 属性,**uni-app 版已移除**,直接用 `noMore.text` / `noMore.color` 即可;
- 其余属性完全一致。
### 相关
- [Scroller 滚动容器](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/scroller) · [Empty 空列表组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/empty)
---
## Refresh 下拉刷新组件
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/refresh | 来源:`doc/uniapp/components/refresh.md`
`` 提供下拉刷新动画,放在 `coolui-scroller` 的 `refresh` 插槽里。`type` 支持 `default`(小程序原生三个圆点)、`base`、`logoText`、`diy` 四种效果。
> 对应原生微信小程序版:[Refresh 下拉刷新组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/refresh)
### 代码演示
**组合式 API**
```vue
{{ item.title }}
```
**选项式 API**
```vue
{{ item.title }}
```
### 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| type | 下拉效果:`default`(小程序原生)/ `base` / `logoText` / `diy` | _String_ | `'default'` |
| threshold | 下拉进度 0~1,支持 `v-model:threshold` | _Number_ | `0` |
| isloading | 是否加载中 | _Boolean_ | `false` |
| refreshstate | 刷新状态:`pulldown` / `loosen` / `loading`,支持 `v-model:refreshstate` | _String_ | `'pulldown'` |
| config | 下拉配置(与默认配置深合并) | _Object_ | `{}` |
#### config 常用项
| 字段 | 说明 | 默认值 |
| --- | --- | --- |
| height | refresh 自身高度(松手后回落到这里显示加载动画) | `50` |
| background.height | 下拉行程,设得比 `height` 大才有两段回弹的弹性感 | — |
| background.color / img | 下拉背景颜色 / 图片 | — |
| style | 圆点深色 `black` 或浅色 | `'black'` |
| shake | 下拉时是否抖动 | `false` |
| isAutoTriggered | 松手后是否自动回弹(`false` 时需手动调用 `scroller.settriggered(false)` 配合) | `true` |
| text.color / shadow | `base` / `logoText` 类型的文字颜色与阴影 | `{ color: '#000', shadow: 0 }` |
### 事件
| 事件 | 说明 | 参数 |
| --- | --- | --- |
| update:threshold / thresholdChange | 下拉进度变化 | `threshold: number` |
| update:refreshstate / refreshstateChange | 刷新状态变化 | `state: 'pulldown' \| 'loosen' \| 'loading'` |
### 插槽
| 插槽 | 说明 |
| --- | --- |
| parallax | 视差区域,配合 [`coolui-scroller-parallax`](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/parallax) 使用(`type="diy"`) |
| 默认 | `diy` 类型的自定义内容 |
### 与原生版的差异
- props 完全一致;动画实现上原生用 `wx.createAnimation`,uni-app 版用 CSS transition;
- 原生 `externalClasses: ['refresh-class']` 换成 `virtualHost + apply-shared`,页面里用 `:deep()` 覆盖样式;
- 新增 `update:threshold` / `update:refreshstate`(可写 `v-model:threshold`),原生的 `thresholdChange` / `refreshstateChange` 依然保留。
### 相关
- [快速开始](https://wzs28150.github.io/coolui-scroller/v4/uniapp/quickstart) · [常见问题:下拉没有弹性](https://wzs28150.github.io/coolui-scroller/v4/advanced/faq#下拉刷新没有弹性回弹感)
---
## Parallax 下拉视差组件
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/parallax | 来源:`doc/uniapp/components/parallax.md`
`` 让元素随下拉产生位移,**必须放在 `coolui-scroller-refresh` 的 `parallax` 插槽里**(配合 `type="diy"`),它自己会从 refresh 拿到下拉进度。
> 对应原生微信小程序版:[Parallax 下拉视差组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/parallax)
### 代码演示
**组合式 API**
```vue
从下往上
从上往下
{{ item.title }}
```
**选项式 API**
```vue
从下往上
从上往下
{{ item.title }}
```
### 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| parallax | 视差系数,值越大位移越明显 | _Number_ | `0` |
| direction | 位移方向:`to top` / `to bottom` / `to left` / `to right` | _String_ | `'to bottom'` |
### 插槽
| 插槽 | 说明 |
| --- | --- |
| 默认 | 需要产生视差的内容 |
### 与原生版的差异
- props 完全一致;
- 原生通过 `relations` 从 refresh 组件读取 `threshold` 与 `config`,uni-app 版改为 `inject('cooluiRefresh')`,因此**必须放在 refresh 的 `parallax` 插槽内**,层级不要打乱;
- 原生 `externalClasses: ['parallax-class']` 已移除,页面里用 `:deep()` 覆盖样式。
### 相关
- [Refresh 下拉刷新组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/refresh) · [示例:有趣的下拉](https://wzs28150.github.io/coolui-scroller/v4/case/case)
---
## Nav 分类导航组件
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/nav | 来源:`doc/uniapp/components/nav.md`
`` 是分类导航(横向滚动 + 选中态),常放在 `coolui-scroller` 的 `header` 插槽里,与 [`nav-pannel`](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/navPannel) 联动切换内容。
> 对应原生微信小程序版:[Nav 分类导航组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/nav)
### 代码演示
**组合式 API**
```vue
{{ item.title }}
```
**选项式 API**
```vue
{{ item.title }}
```
### 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| list | 导航数据,每项 `{ id, title }` | _Array_ | `[]` |
| border | 是否显示下边框 | _Boolean_ | `true` |
| text | 文字颜色配置 `{ color, activeColor }` | _Object_ | `{ color: '#333333', activeColor: '#d13435' }` |
| background | 背景配置 `{ color, activeColor }` | _Object_ | `{ color: '#333333', activeColor: '#d13435' }` |
| navPerView | 一屏显示几个(可传 `'auto'` 由内容撑开) | _Number_ / _String_ | `4.5` |
| spaceBetween | 相邻项间距 | _Number_ | `0` |
| type | 展示类型:`line` / `round` / `plain` | _String_ | `'line'` |
| active | 当前选中索引,支持 `v-model:active` | _Number_ | `0` |
### 事件
| 事件 | 说明 | 参数 |
| --- | --- | --- |
| change | 选中项变化 | `{ id, index }` |
| update:active | 选中索引变化(配 `v-model:active`) | `index: number` |
### 与原生版的差异
- 属性一致;
- `change` 事件原生只返回 `{ id }`,uni-app 版返回 `{ id, index }`;
- 新增 `update:active`,可直接 `v-model:active` 受控。
### 相关
- [NavPannel 切换组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/navPannel) · [示例:下拉组合](https://wzs28150.github.io/coolui-scroller/v4/case/case2)
---
## NavBar 顶部导航栏
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/navBar | 来源:`doc/uniapp/components/navBar.md`
`` 是自定义顶部导航栏,配合[下拉二楼](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/floor)使用(放在 `second-floor` 的 `nav-bar` 插槽里),也可单独用于自定义导航栏页面。
> 原生侧同样有 `coolui-scroller/nav-bar/index` 组件,但暂时没有独立文档页。
### 代码演示
**组合式 API**
```vue
下拉二楼
页面内容
```
**选项式 API**
```vue
下拉二楼
页面内容
```
### 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| type | 导航栏类型 | _String_ | `'default'` |
| config | 导航栏配置(`back` / `background` / `text`) | _Object_ | `{}`(内部默认见下) |
`config` 默认值:`{ back: { show: true }, background: { color: '#fff' }, text: { color: '#000', shadow: 0 } }`
### 插槽
| 插槽 | 说明 |
| --- | --- |
| 默认 | 导航栏标题内容 |
### 与原生版的差异
- 属性一致;
- 原生 `externalClasses: ['nav-bar-class']` 已移除,页面里用 `:deep()` 覆盖样式。
### 相关
- [SecondFloor 下拉二楼组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/floor)
---
## NavPannel 切换组件
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/navPannel | 来源:`doc/uniapp/components/navPannel.md`
`` 是内容切换容器:默认插槽里放多个 `coolui-scroller`,通过 `active` 切换显示哪一个,常与[分类导航](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/nav)配合。
> 对应原生微信小程序版:[NavPannel 切换组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/navPannel)
### 代码演示
**组合式 API**
```vue
第一屏内容
第二屏内容
```
**选项式 API**
```vue
第一屏内容
第二屏内容
```
### 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| active | 当前显示第几屏 | _Number_ | `0` |
| animation | 切换是否带过渡动画 | _Boolean_ | `false` |
| type | 切换方式:`side`(左右滑动)/ `fade`(淡入淡出) | _String_ | `'side'` |
### 插槽
| 插槽 | 说明 |
| --- | --- |
| 默认 | 多个 `coolui-scroller`,顺序与 `active` 对应 |
### 与原生版的差异
- 属性一致;
- 实现方式不同:原生通过 `relations` 统计子 `scroller` 的数量与宽高来定位,uni-app 版改为纯 CSS(`transform: translateX(-100% * active)`),因此**子 scroller 必须是直接子节点**,中间不要再包一层。
### 相关
- [Nav 分类导航组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/nav) · [Scroller 滚动容器](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/scroller)
---
## Search 搜索组件
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/search | 来源:`doc/uniapp/components/search.md`
`` 是搜索框,支持输入、清空、右侧按钮与自定义左侧插槽,常放在 `coolui-scroller` 的 `header` 插槽里。
> 对应原生微信小程序版:[Search 搜索组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/search)
### 代码演示
**组合式 API**
```vue
```
**选项式 API**
```vue
```
### 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| placeholder | 占位文字 | _String_ | `'请输入要搜索的内容'` |
| button | 右侧按钮配置 `{ show, text }` | _Object_ | `{ show: false, text: '搜索' }` |
| round | 是否圆角 | _Boolean_ | `false` |
| clearable | 是否显示清空按钮 | _Boolean_ | `false` |
| keyword | 搜索内容,支持 `v-model:keyword` | _String_ | `''` |
### 事件
| 事件 | 说明 | 参数 |
| --- | --- | --- |
| update:keyword | 输入内容变化(配 `v-model:keyword`) | `keyword: string` |
| input | 输入中 | `keyword: string` |
| focus / blur | 聚焦 / 失焦 | — |
| btnClick | 点击右侧按钮 | `{ key }` |
| confirm | 键盘确认 | `{ key }` |
### 插槽
| 插槽 | 说明 |
| --- | --- |
| leftout | 搜索框左侧自定义内容 |
### 与原生版的差异
- **属性改名**:原生是 `key`,而 `key` 在 Vue 中是保留字,uni-app 版改为 **`keyword`**,配合 `@update:keyword`(可写 `v-model:keyword`);
- 原生 `externalClasses`(`search-btn-class` / `search-inner-class` / `search-placeholder-class`)已移除,改用 CSS 变量定制主题:
| CSS 变量 | 作用 |
| --- | --- |
| `--color` | 文字颜色 |
| `--placeholder-color` | 占位文字颜色 |
| `--input-bg-color` | 输入框背景色 |
- 新增 `update:keyword` / `input` / `focus` / `blur` 事件;`btnClick`、`confirm` 参数与原生一致(`{ key }`)。
### 相关
- [Nav 分类导航组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/nav) · [Sort 排序及分类筛选组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/sort)
---
## Sort 排序及分类筛选组件
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/sort | 来源:`doc/uniapp/components/sort.md`
`` 是排序 / 筛选的容器,具体筛选项由 `` 提供,支持排序、多选分类、自定义面板三种类型。
> 对应原生微信小程序版:[Sort 排序及分类筛选组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/sort)
### 代码演示
**组合式 API**
```vue
自定义区域
```
**选项式 API**
```vue
自定义区域
```
### Sort 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| overlay | 是否显示遮罩 | _Boolean_ | `true` |
| overlayDuration | 遮罩动画时长(ms) | _Number_ | `500` |
| scroll | 面板内容是否可滚动 | _Boolean_ | `false` |
### SortItem 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| title | 标题文字 | _String_ | `''` |
| name | 标识,`change` 事件里回传 | _String_ | `''` |
| type | 类型:`sort` / `classify` / `diy` | _String_ | `''` |
| value | 选中值,支持 `v-model:value`(多选时为数组) | _String_ / _Number_ / _Array_ | `''` |
| options | 选项列表,每项 `{ id, title }` | _Array_ | `[]` |
| color | 未选中文字颜色 | _String_ | `'#333'` |
| activeColor | 选中文字颜色 | _String_ | `'#d13435'` |
| multiple | 是否多选 | _Boolean_ | `false` |
| actionBar | 是否显示底部操作条(重置 / 确定) | _Boolean_ | `false` |
### 事件(SortItem)
| 事件 | 说明 | 参数 |
| --- | --- | --- |
| update:value | 选中值变化(配 `v-model:value`) | `value` |
| change | 选项变化 | `{ name, value }` |
### 插槽(SortItem)
| 插槽 | 说明 |
| --- | --- |
| 默认 | `type="diy"` 时的自定义面板内容 |
### 与原生版的差异
- `sort` 三个属性与原生一致;
- `sort-item` 的 `value` 原生只支持 String,uni-app 版放宽为 **String / Number(多选 Array)**;
- 新增 `update:value` 与 `change` 事件(原生没有),可以直接 `v-model:value` 受控;
- 动画实现上原生用 `wx.createAnimation`,uni-app 版用 CSS transition。
### 相关
- [Nav 分类导航组件](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/nav) · [示例:下拉组合](https://wzs28150.github.io/coolui-scroller/v4/case/case2)
---
## SecondFloor 下拉二楼组件
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/floor | 来源:`doc/uniapp/components/floor.md`
`` 实现「下拉二楼」:下拉到阈值后进入第二个页面(二楼),支持居中、上下方向、缩放等效果。二楼内容的刷新动画用 ``,顶部导航栏用 [`coolui-scroller-nav-bar`](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/navBar)。
> 对应原生微信小程序版:[SecondFloor 下拉二楼组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/floor)
### 代码演示
**组合式 API**
```vue
二楼
下拉二楼
一楼内容
```
**选项式 API**
```vue
二楼
下拉二楼
一楼内容
```
### SecondFloor 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| threshold | 下拉进度 0~1,支持 `v-model:threshold` | _Number_ | `0` |
| offset | 触发偏移量 | _Number_ | `0` |
| center | 二楼内容是否居中 | _Boolean_ | `false` |
| bottom | 从底部下拉 | _Boolean_ | `true` |
| top | 从顶部下拉 | _Boolean_ | `false` |
| scale | 是否开启缩放效果 | _Boolean_ | `false` |
| tip | 自动下拉提示 `{ show, height, times, duration }` | _Object_ | `{ show: false, height: 100, times: 1, duration: 2000 }` |
### SecondFloor 事件
| 事件 | 说明 | 参数 |
| --- | --- | --- |
| refresh | 二楼下拉刷新触发 | — |
| secondShow | 进入二楼 | — |
| secondBack | 返回一楼 | — |
### 插槽
| 插槽 | 说明 |
| --- | --- |
| second-floor | 二楼内容 |
| second-floor-refresh | 二楼的下拉刷新动画 |
| nav-bar | 二楼顶部导航栏 |
| 默认 | 一楼内容 |
### SecondFloor 实例方法
通过 `ref` 获取组件实例后调用:
| 方法 | 说明 |
| --- | --- |
| back(callback?) | 返回一楼 |
| settriggered() | 手动回弹(配合刷新组件不自动回弹的场景) |
| init(callback?) | 初始化 |
### SecondFloorRefresh 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| refreshConfig | 文案与颜色配置 `{ downText, loadingText, backText, tipText, moreText, color }` | _Object_ | `{}` |
| backBgColor | 返回按钮背景色(**uni-app 版新增**) | _String_ | `''` |
### 与原生版的差异
- `second-floor` 的属性与事件和原生一致,组件通信由原生 `relations` 改为 `provide/inject`;
- `second-floor-refresh` 新增 `backBgColor`;原生 `externalClasses`(`second-floor-refresh-class` / `second-floor-refresh-back`)已移除,页面里用 `:deep()` 覆盖样式。
### 相关
- [NavBar 顶部导航栏](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/navBar) · [示例:下拉二楼](https://wzs28150.github.io/coolui-scroller/v4/case/case3)
---
## BackToTop 回到顶部组件
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/backToTop | 来源:`doc/uniapp/components/backToTop.md`
`` 是回到顶部按钮,放在 `coolui-scroller` 的 `backToTop` 插槽里;滚动超过阈值后显示,一段时间无操作自动隐藏。
> 对应原生微信小程序版:[BackToTop 回到顶部组件](https://wzs28150.github.io/coolui-scroller/v4/native/components/backToTop)
### 代码演示
**组合式 API**
```vue
{{ item.title }}
```
**选项式 API**
```vue
{{ item.title }}
```
### 属性
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| delay | 显示后自动隐藏的延时(ms),`0` 表示不自动隐藏 | _Number_ | `3000` |
| threshold | 滚动超过该距离后显示按钮 | _Number_ | `100` |
### 实例方法
通过 `ref` 获取组件实例后调用:
| 方法 | 说明 |
| --- | --- |
| backToTop() | 手动回到顶部 |
### 与原生版的差异
- 属性一致;
- 原生 `externalClasses: ['my-class']` 已移除,页面里用 `:deep()` 覆盖样式。
### 相关
- [Scroller 滚动容器](https://wzs28150.github.io/coolui-scroller/v4/uniapp/components/scroller)
---
# 五、进阶:常见问题
## 常见问题 FAQ
> 在线文档:https://wzs28150.github.io/coolui-scroller/v4/advanced/faq | 来源:`doc/advanced/faq.md`
这里收集的是实际项目里最常遇到的几类问题。两个版本表现基本一致,涉及写法差异的地方会分别说明。
### 下拉刷新没有弹性回弹感
**现象**:下拉时很快到底、松手只回弹一次,手感发硬;而示例里「下拉刷新 - 原生效果」那种"松手先回落、刷新完再整体回弹"的两段回弹没有出现。
**原因**:组件下拉时的位移是 `moveY = -moveHeight + distance * 0.5`,`moveHeight` 取自 `background.height || height`。没有设置 `background.height` 时它等于 `height`(比如 50),手指拉约 100px 就饱和,只剩单段回弹。
**解决**:让下拉行程大于刷新自身高度:
```js
{
height: 50, // 刷新自身高度:松手后回落到这里显示加载动画
background: { color: '#f2f2f2', height: 120 } // 下拉行程:整体回弹的距离
}
```
两个版本都适用(uni-app 版写在 `` 或对应组件配置里)。
### H5 上出现页面级滚动条(小程序正常)
**原因**:H5 端 uni-app 会额外渲染内置导航栏(高度 = `--window-top`),而页面写的 `height: 100vh` 是整个视口高度,没扣掉这一截;同时 `pages.json` 的 `disableScroll` 只在小程序端生效。所以小程序正常、H5 多出一条滚动条。
**解决**:全屏页按可视区高度兜底,并用条件编译只影响 H5:
```scss
/* #ifdef H5 */
.page {
height: calc(100vh - var(--window-top, 0px) - var(--window-bottom, 0px));
}
/* #endif */
```
内容高于一屏的页面(`min-height: 100vh`)只改 `min-height` 即可,仍保留正常滚动。详见[跨端差异](https://wzs28150.github.io/coolui-scroller/v4/uniapp/platform-diff#h5-内置导航栏会额外占高)。
### 列表项之间没有间距、内容贴着卡片边缘
**原因**:一是页面里把卡片容器的内边距重置成了 0(`.pannel .pannel-inner { padding: 0 }`);二是列表项的间距写成了 `.coolui-scroller .item` 这类**跨组件选择器**,在页面 scoped 样式里穿不进组件,小程序端尤其明显。
**解决**:
- 卡片留白交给容器样式(不要重复声明或重置全局卡片样式);
- 列表项间距写在**页面可命中的选择器**上,或给插槽内容自带 class 后再写样式。
### 长列表高度不对 / 滚动位置跳动
长列表靠"页"来占位,页高需要算准:
- 原生微信小程序版 `scroll-page`:需要引入组件提供的方法计算每个 page 页面的高度(见 [ScrollPage 文档](https://wzs28150.github.io/coolui-scroller/v4/native/components/page))。
- uni-app 版优先用 `coolui-scroller-longlist`:窗口化方案,窗口外折叠为上下占位块,不依赖总页数。
页高与实际内容高度差别越大,滚动条长度和滚动位置就越不准,尽量让每页内容高度一致。
### easycom 配置后组件不生效(uni-app)
按顺序排查:
1. `pages.json` 改完是否重新编译;
2. `autoscan: false` 时规则必须自己写全,标签名要能匹配你写的正则;
3. 组件目录名与规则里的路径是否一致(拷贝源码接入时尤其容易漏,路径要指向你实际放置的目录)。
见[安装与引入](https://wzs28150.github.io/coolui-scroller/v4/uniapp/install#方式一easycom推荐)。
### 事件 / 属性名对不上(uni-app)
原生微信小程序版的 `bind:refresh` 在 uni-app 版是 `@refresh`;`sort-item` 的选中值通过 `@update:value` 同步;search 组件的 `key` 因是 Vue 保留字改名为 `keyword`(`@update:keyword`)。完整对照见[与原生微信小程序版的差异](https://wzs28150.github.io/coolui-scroller/v4/uniapp/platform-diff)。
### 该选原生微信小程序版还是 uni-app 版?
| 你的项目 | 选它 |
| --- | --- |
| 微信小程序原生项目(不走 uni-app 编译) | [原生微信小程序版](https://wzs28150.github.io/coolui-scroller/v4/native/install),包名 `coolui-scroller` |
| uni-app 项目,需要同时编译到小程序 / H5 / App | [uni-app 版](https://wzs28150.github.io/coolui-scroller/v4/uniapp/install),包名 `coolui-scroller-uni` |
两个版本组件能力与配置项一致,用顶部平台切换器即可在对应文档间跳转。
---