fix(药分享): 修正 page-meta 位置并兜底接口返回,修复首屏报错

问题一:<page-meta> 渲染层报错“只能是页面内的第一个节点”
page-meta 原先嵌在根 view 内,位置在根节点的孙级。而编译器
uni-template-compiler/lib/template/generate.js 的 parsePageMeta 只检查
根节点的直接 children,匹配不到就不做“提升为第一个节点”的处理;
加上 webpack-uni-app-loader/page-meta.js 只要模板含 <page-meta 就会
无条件外包一层 <view>,最终渲染成
  <view class="data-v-xxx"><view class="share-page">...<page-meta>
导致微信报错。改为让 page-meta 与业务根 view 平级、放在最前,
经真实编译器验证产物第一个标签已是 <page-meta>。

问题二:onShow 抛 Cannot read properties of undefined (reading 'list')
直接诱因是后端 /yxe/yxe-share-detail/page?groupByProduct=true 报错
(见 yxe-java 侧提交),返回体 code=1 且不带 data,getProductList 里
data.list 抛异常并中断整个 onShow,页面数据全部不渲染。
本次在小程序侧做防御性兜底,避免任一接口失败就整页白屏:
- getProductList / getTodayShare / getShareUserData / getUserData /
  getRule / getShareData 均按要求校验再赋值
- getShareData 改用 slice() 排序,避免就地改动接口返回的数组;
  amount 缺失按 0 处理,避免 NaN 让排序结果不稳定
This commit is contained in:
2026-10-12 14:49:18 +08:00
parent 2ff8d42207
commit 2992f4ee49
+16 -9
View File
@@ -1,6 +1,6 @@
<template>
<page-meta :page-style="pageStyle"/>
<view class="share-page">
<page-meta :page-style="pageStyle"/>
<view class="share-hero">
<AppNavbar title="药分享">
</AppNavbar>
@@ -651,7 +651,7 @@ export default {
},
async getRule() {
const {data} = await dictDataInfoReq(576)
this.rewardRules = data.dictDataCode
this.rewardRules = (data && data.dictDataCode) || ''
},
async getShareData() {
const params = {
@@ -662,17 +662,22 @@ export default {
params.merchantId = this.merchantId
}
const {data} = await shareDataReq(params)
const list = Array.isArray(data) ? data : (data && data.list ? data.list : [])
this.brandRanks = list.sort((a, b) => parseFloat(b.amount) - parseFloat(a.amount))
const list = Array.isArray(data) ? data : (data && Array.isArray(data.list) ? data.list : [])
// slice 避免就地排序改动接口返回的数组;amount 缺失时按 0 处理,避免 NaN 让排序结果不稳定
this.brandRanks = list.slice().sort((a, b) => (parseFloat(b.amount) || 0) - (parseFloat(a.amount) || 0))
},
async getShareUserData() {
const {data} = await shareUserDataReq()
this.data = data
// 接口业务失败(code!=0)时 get 仍会 resolve 出不含 data 的响应体,
// 这里必须兜底为默认统计值,否则模板里的 data.num 会整页崩掉
this.data = data && typeof data === 'object'
? Object.assign({income: 0, num: 0, totalNum: 0, totalIncome: 0}, data)
: {income: 0, num: 0, totalNum: 0, totalIncome: 0}
},
async getUserData() {
const {data} = await userInfoReq()
this.isLoggedIn = true
this.user = data
this.user = data && typeof data === 'object' ? data : {canAuth: 0}
},
async getTodayShare() {
const params = {
@@ -685,7 +690,7 @@ export default {
params.merchantId = this.merchantId
}
const {data} = await shareListReq(params)
this.todayEntries = data
this.todayEntries = Array.isArray(data) ? data : []
this.showAllToday = false
this.updateTodayDistances()
},
@@ -701,8 +706,10 @@ export default {
params.merchantId = this.merchantId
}
const {data} = await shareDetailPageReq(params)
this.shareProducts = data.list
this.shareProducts = this.shareProducts.filter(item => !!item.product).filter((item, index) => index < 48)
// 后端分页接口失败时 data 为 undefined,直接取 data.list 会抛
// "Cannot read properties of undefined (reading 'list')"
const list = Array.isArray(data && data.list) ? data.list : []
this.shareProducts = list.filter(item => !!item.product).slice(0, 48)
this.showAllProducts = false
this.productKeyword = ''
this.productKeywordApplied = ''