给 AI 编码助手(Cursor / Claude Code / Codex / Copilot 等)的说明。分两部分:在业务项目里使用这套组件、在本仓库里修改这套组件。
本文件不在仓库根目录,位于
doc/AGENTS.md。它同时是随 npm 包发布的packages/native/AGENTS.md、packages/uniapp/AGENTS.md的唯一手写来源(生成器会摘取下面的「用法速查」章节)。
coolui-scroller 是一个专注小程序「下拉刷新 / 上拉加载 / 长列表」的组件库,双版本同仓维护:
| 版本 | npm 包 | 源码目录 | 技术栈 |
|---|---|---|---|
| 原生微信小程序版 | coolui-scroller |
packages/native/ |
WXML / WXSS / JS,父子组件用 relations 自动关联 |
| uni-app 版 | coolui-scroller-uni |
packages/uniapp/ |
Vue(<script setup lang="ts">),父子组件用 provide/inject |
两版组件能力与配置项一致,差别只在引入方式与个别平台写法。改任何 API 都要同时改两边。
doc/public/llms-full.txt(线上:https://wzs28150.github.io/coolui-scroller/v4/llms-full.txt)——全部组件 API 与示例合并成的单文件全文,需要了解组件用法时优先整份读入。doc/public/llms.txt(线上:https://wzs28150.github.io/coolui-scroller/v4/llms.txt)——文档索引,按需取页。doc/native/components/*.md、doc/uniapp/components/*.md——单组件文档(属性 / 插槽 / 事件 / 方法 / 示例表格)。packages/uniapp/types.d.ts——uni-app 版全部 props / 事件 / 组件间通信 API 的类型定义,最精确。packages/native/<组件>/index.js 的 properties / methods——原生版的准确定义。packages/native/llms.txt、packages/uniapp/llms.txt 与各自的 AGENTS.md——随 npm 包发布给使用方的版本。<scroller>(uni-app:<coolui-scroller>)是滚动容器,其余能力全部通过具名插槽装配子组件:
| 插槽 | 放什么 | 说明 |
|---|---|---|
header |
nav / search / sort | 固定在顶部的头部区 |
refresh |
refresh(可再嵌 parallax) | 放了才有下拉刷新 |
| 默认插槽 | item / scroll-page / longlist / 自己的列表 | 列表主体 |
loadmore |
loadmore | 触底加载区 |
empty |
empty | isEmpty 为 true 时显示 |
backToTop |
backToTop | 滚动超过阈值后显示 |
页面要设置 "disableScroll": true(原生写在页面 index.json,uni-app 写在 pages.json),否则页面级下拉会和组件下拉冲突。
// index.json
{
"usingComponents": {
"scroller": "coolui-scroller/scroller/index",
"refresh": "coolui-scroller/refresh/index",
"item": "coolui-scroller/item/index",
"loadmore": "coolui-scroller/loadmore/index",
"empty": "coolui-scroller/empty/index"
},
"disableScroll": true
}
<!-- index.wxml -->
<scroller isEmpty="" bind:refresh="refresh" bind:loadmore="loadmore">
<refresh slot="refresh" type="default" config="" />
<item wx:for="" wx:key="id"></item>
<loadmore slot="loadmore" status="" />
<empty slot="empty" emptyText="暂无内容" />
</scroller>
// index.js
Page({
data: {
list: [],
page: 1,
isEmpty: false,
loadStatus: 'more', // more | loading | noMore
// background.height 大于 height 才有"先回落到 height、刷新完再整体回弹"的弹性感
refreshConfig: { height: 50, background: { color: '#f2f2f2', height: 120 } },
},
onLoad() {
this.fetchList(1)
},
fetchList(page) {
// 请求数据后:this.setData({ list, isEmpty: list.length === 0, loadStatus: 'more' })
},
refresh() {
this.setData({ page: 1, list: [] })
this.fetchList(1) // 数据真正返回后组件才收起刷新动画
},
loadmore() {
this.setData({ page: this.data.page + 1, loadStatus: 'loading' })
this.fetchList(this.data.page)
},
})
// pages.json:easycom 免 import(推荐)
{
"easycom": {
"autoscan": false,
"custom": {
"^coolui-scroller(-.*)?$": "coolui-scroller-uni/components/coolui-scroller$1/coolui-scroller$1.vue"
}
}
}
<template>
<coolui-scroller :isEmpty="isEmpty" @refresh="refresh" @loadmore="loadmore">
<template #refresh>
<coolui-scroller-refresh :config="{ height: 50, background: { height: 120 } }" />
</template>
<coolui-scroller-item v-for="item in list" :key="item.id"></coolui-scroller-item>
<template #loadmore>
<coolui-scroller-loadmore :status="loadStatus" />
</template>
</coolui-scroller>
</template>
| 作用 | 原生微信小程序 | uni-app |
|---|---|---|
| 下拉刷新回调 | bind:refresh |
@refresh |
| 触底加载回调 | bind:loadmore |
@loadmore |
| 内容区高度(px) | bind:contentHeight(res.detail) |
@contentHeight |
| 空数据 | isEmpty="" |
:isEmpty="..." |
| 手动收起刷新 | 组件实例 settriggered(false) |
同左(ref 调用) |
加载更多状态:loadmore 的 status 取 more / loading / noMore。
下拉刷新类型:refresh 的 type 取 default(原生三点)/ base / logoText / diy。
disableScroll → 页面级下拉与组件下拉冲突。background.height 要大于 height(例:height: 50、background.height: 120)。scroll-page;uni-app 首选 coolui-scroller-longlist(窗口化,渲染节点数与总页数无关)。calc(100vh - var(--window-top, 0px) - var(--window-bottom, 0px)),并用 /* #ifdef H5 */ 包裹。key → keyword(@update:keyword),handtip 的 key → storageKey。scroller → refresh → parallax、sort → sort-item、nav-pannel → scroller、second-floor → second-floor-refresh / nav-bar。scoped 样式穿不进组件插槽:给插槽内容自己的 class,别写 .coolui-scroller .item 这类跨组件选择器。| 路径 | 说明 |
|---|---|
packages/native/ |
原生微信小程序版:每个组件一个目录(index.js / .json / .wxml / .wxss / .scss) |
packages/uniapp/ |
uni-app 版:components/coolui-scroller-*/、utils/、types.d.ts、index.js |
doc/ |
VitePress 文档站,唯一事实来源;doc/.vitepress/config.js 里维护 sidebar 组件清单 |
doc/AGENTS.md |
本文件:AI 协作说明,同时是两个包内 AGENTS.md 的来源 |
demo/native/、demo/uniapp/ |
示例工程 |
demo/uniapp-plugin/ |
发布 DCloud 插件市场用的 uni_modules 示例工程。生成物:uni_modules/<插件ID>/ 来自 packages/uniapp,pages/、static/、App.vue、pages.json 等来自 demo/uniapp/src,统一由 pnpm build:uni-modules 生成,勿手改 |
v2/、v3/、v4/ |
历史版本与文档构建产物,不要手改 |
scripts/build-llms.mjs |
生成 AI 文档:doc/public/ 下的 llms.txt / llms-full.txt,以及 packages/*/llms.txt / packages/*/AGENTS.md |
scripts/build-uni-modules.mjs、scripts/sync-plugin-demo.mjs |
生成插件市场工程:前者把 packages/uniapp 同步成 uni_modules 插件,后者把 demo/uniapp/src 的示例页面转换(补 auto-import、改模块路径)后同步过来;pnpm build:uni-modules 会依次执行两者并自查 |
packages/native/<目录>/packages/uniapp/components/coolui-scroller-<名称>/packages/uniapp/types.d.tsdoc/native/components/*.md 与 doc/uniapp/components/*.md(属性 / 插槽 / 事件表格)doc/.vitepress/config.js 的 sidebar、packages/uniapp/index.js 导出,以及(如需要)packages/native/ 的入口pnpm docs:llms| 命令 | 作用 |
|---|---|
pnpm install |
安装依赖 |
pnpm dev |
启动文档站开发服务 |
pnpm build |
构建文档站到 v4/ |
pnpm docs:llms |
重新生成 AI 文档(doc/public/ 下 + 两个 npm 包内) |
pnpm build:uni-modules |
生成 DCloud 插件市场工程:同步 uni_modules/ 插件 + 从 demo/uniapp/src 同步示例页面(发布前跑这个) |
pnpm sync:plugin-demo |
只同步示例页面(demo/uniapp/src → demo/uniapp-plugin) |
pnpm dev:uniapp / pnpm build:uniapp |
编译 uni-app demo 到微信小程序 |
cd packages/uniapp && pnpm type-check |
uni-app 版类型检查(vue-tsc) |
doc/ 为准,代码改动必须同步更新文档。doc/uniapp/platform-diff.md 记录。doc/public/llms.txt、doc/public/llms-full.txt,以及 packages/native/、packages/uniapp/ 下的 llms.txt / AGENTS.md——都不要手改;本文件(doc/AGENTS.md)是包内 AGENTS.md 的唯一手写来源,改完 doc/ 或本文件后执行 pnpm docs:llms。