/** * 列表/看板下拉刷新:自定义导航用 scroll-view refresher,整页滚动用 onPullDownRefresh。 * 页面需实现 reload();请求结束务必调 finishRefresh(),否则转圈不收起。 * 最短转圈 400ms:接口太快时微信 refresher 动画来不及展开,看起来像「下拉没反应」。 */ const MIN_REFRESH_MS = 400 export default { data() { return { isRefreshing: false, } }, methods: { /** * 统一走 reload();若返回 Promise 则在 finally 收起转圈 */ runPullRefresh() { this.isRefreshing = true const started = Date.now() const done = () => { const wait = Math.max(0, MIN_REFRESH_MS - (Date.now() - started)) setTimeout(() => this.finishRefresh(), wait) } if (typeof this.reload !== 'function') { done() return } try { const ret = this.reload() if (ret && typeof ret.then === 'function') { ret.finally(done) } else { this.$nextTick(done) } } catch (e) { done() } }, /** * scroll-view 下拉:先亮转圈再重拉当前列表 */ onRefresherRefresh() { this.runPullRefresh() }, /** * 整页原生下拉:重拉后必须 stop,否则系统转圈卡住 */ onPullDownRefresh() { this.runPullRefresh() }, /** * 请求 finally 里关掉两种转圈 */ finishRefresh() { this.isRefreshing = false try { uni.stopPullDownRefresh() } catch (e) { /* 未开启原生下拉时忽略 */ } }, }, }