- 8 个页面 exercise-card 由 bind:tap 改为 catch:tap,拦截原生 tap 冒泡 避免一次点击被『自定义事件 + 原生冒泡』触发两次, 第二次 e.detail 无 id → navigateTo detail?id=undefined → 404 - 所有 onExercise 顶部加 id 守卫,无 id 直接 return - exercise-card 点击前校验 exercise.id,缺失不触发 - detail onLoad 的 id 为空时直接显示空态,不再发起错误请求
45 lines
2.1 KiB
Plaintext
45 lines
2.1 KiB
Plaintext
<view class="page" wx:if="{{collection}}">
|
||
<navbar title="{{collection.name}}" show-back />
|
||
|
||
<view class="header" style="background: linear-gradient(135deg, {{collection.color}}26, var(--surface));">
|
||
<view class="header__emoji" style="background: {{collection.color}}22; color: {{collection.color}};">{{collection.emoji}}</view>
|
||
<view class="header__name" style="color: {{collection.color}};">{{collection.name}}</view>
|
||
<view wx:if="{{collection.nameEn}}" class="header__en">{{collection.nameEn}}</view>
|
||
<view class="header__desc">{{collection.description}}</view>
|
||
|
||
<view class="header__meta">
|
||
<level-tag level="{{collection.level}}" />
|
||
<text class="header__sep">·</text>
|
||
<text class="header__m" wx:if="{{collection.sessionsPerWeek}}">每周 {{collection.sessionsPerWeek}} 次</text>
|
||
<text class="header__sep" wx:if="{{collection.sessionsPerWeek && collection.durationWeeks}}">·</text>
|
||
<text class="header__m" wx:if="{{collection.durationWeeks}}">约 {{collection.durationWeeks}} 周</text>
|
||
<text class="header__sep" wx:if="{{collection.focus}}">·</text>
|
||
<text class="header__m" wx:if="{{collection.focus}}">{{collection.focus}}</text>
|
||
</view>
|
||
</view>
|
||
|
||
<view class="section" style="padding-top: 8rpx;">
|
||
<section-header eyebrow="EXERCISES" title="动作列表" subtitle="共 {{total}} 个动作" />
|
||
<view class="grid" wx:if="{{exercises.length}}">
|
||
<view class="grid__item" wx:for="{{exercises}}" wx:key="id">
|
||
<exercise-card exercise="{{item}}" catch:tap="onExercise" />
|
||
</view>
|
||
</view>
|
||
<view wx:elif="{{!loading}}" class="empty">该计划暂无动作</view>
|
||
<view wx:else class="empty">加载中…</view>
|
||
</view>
|
||
|
||
<view class="actionbar">
|
||
<view class="btn btn--ghost {{favorited ? 'btn--faved' : ''}}" bindtap="onToggleFav">
|
||
<text>{{favorited ? '♥ 已收藏' : '♡ 收藏'}}</text>
|
||
</view>
|
||
<view class="btn btn--gold" bindtap="onImport">
|
||
<text>+ 导入我的计划</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
|
||
<view wx:else class="empty-page">
|
||
<view class="empty">{{ loading ? '加载中…' : '未找到该训练计划' }}</view>
|
||
</view>
|