uni-app需手写cascader组件,核心用scroll-view+watch实现联动,禁用enhanced、扁平化数据、硬件加速优化性能。

uni-app里没有内置Cascader组件,得自己搭
uni-app官方组件库(@dcloudio/uni-ui)至今没提供Cascader,H5、小程序、App三端行为不一致,直接用picker的mode="region"或mode="multiSelector"只能应付固定层级(比如省市区),没法动态加载、自定义样式、支持搜索或异步加载。真要“自定义风格”,就得手写一个带层级滚动、联动逻辑和样式接管能力的组件。
核心是用scroll-view + watch做联动,别碰picker
用picker改样式几乎不可行:iOS下multiSelector样式完全封闭;微信小程序虽然能覆盖部分CSS,但层级切换动画、禁用态、loading状态都难控制。正确路径是用scroll-view模拟三级列表,靠watch监听当前选中项,触发下一级数据拉取或过滤:
-
scroll-view设scroll-x实现横向滑动列,每列一个scroll-view,避免嵌套滚动冲突 - 用
v-for渲染每列选项,绑定click事件更新currentLevel和selectedValues - 用
watch监听selectedValues[level],自动请求level + 1的数据(比如选了“北京”,就fetch('/api/cities?province=北京')) - 注意
scroll-view在App端需加enable-back-to-top和show-scrollbar显式控制滚动条可见性
数据格式必须扁平化,别传嵌套树结构
后端返回{ children: [...] }这种嵌套结构,前端处理层级联动会卡顿,尤其在低端安卓机上。实际开发中应要求接口返回扁平数组+层级标识,例如:
[
{ id: "1", name: "华东", level: 0, pid: null },
{ id: "2", name: "上海", level: 1, pid: "1" },
{ id: "3", name: "江苏", level: 1, pid: "1" },
{ id: "4", name: "南京", level: 2, pid: "3" }
]
这样能用filter快速筛出某一级的可选项,也方便做本地搜索(arr.filter(i => i.name.includes(keyword)))。如果后端坚持返树形,务必在mounted里用JSON.parse(JSON.stringify(...))深拷贝再扁平化——否则响应式会丢失。
小程序真机调试时scroll-view滚动卡顿?关掉enhanced
微信小程序基础库 2.27.0+ 默认开启scroll-view增强模式(enhanced),它会让scroll-x在某些机型上出现滚动延迟或跳变。实测发现,只要级联列超过2列、每列选项超15个,卡顿立刻明显。解决方案很简单:
- 在
scroll-view标签上显式写:enhanced="false" - 同时给每列
scroll-view加style="will-change: transform;"触发硬件加速 - 避免在
scroll-view内部放image或复杂slot,优先用background-image替代
这个点在开发者工具里几乎不暴露,只有真机连上微信调试器才能复现,很多人卡在这里调一整天。











