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> <template>
<page-meta :page-style="pageStyle"/>
<view class="share-page"> <view class="share-page">
<page-meta :page-style="pageStyle"/>
<view class="share-hero"> <view class="share-hero">
<AppNavbar title="药分享"> <AppNavbar title="药分享">
</AppNavbar> </AppNavbar>
@@ -651,7 +651,7 @@ export default {
}, },
async getRule() { async getRule() {
const {data} = await dictDataInfoReq(576) const {data} = await dictDataInfoReq(576)
this.rewardRules = data.dictDataCode this.rewardRules = (data && data.dictDataCode) || ''
}, },
async getShareData() { async getShareData() {
const params = { const params = {
@@ -662,17 +662,22 @@ export default {
params.merchantId = this.merchantId params.merchantId = this.merchantId
} }
const {data} = await shareDataReq(params) const {data} = await shareDataReq(params)
const list = Array.isArray(data) ? data : (data && data.list ? data.list : []) const list = Array.isArray(data) ? data : (data && Array.isArray(data.list) ? data.list : [])
this.brandRanks = list.sort((a, b) => parseFloat(b.amount) - parseFloat(a.amount)) // slice 避免就地排序改动接口返回的数组;amount 缺失时按 0 处理,避免 NaN 让排序结果不稳定
this.brandRanks = list.slice().sort((a, b) => (parseFloat(b.amount) || 0) - (parseFloat(a.amount) || 0))
}, },
async getShareUserData() { async getShareUserData() {
const {data} = await shareUserDataReq() 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() { async getUserData() {
const {data} = await userInfoReq() const {data} = await userInfoReq()
this.isLoggedIn = true this.isLoggedIn = true
this.user = data this.user = data && typeof data === 'object' ? data : {canAuth: 0}
}, },
async getTodayShare() { async getTodayShare() {
const params = { const params = {
@@ -685,7 +690,7 @@ export default {
params.merchantId = this.merchantId params.merchantId = this.merchantId
} }
const {data} = await shareListReq(params) const {data} = await shareListReq(params)
this.todayEntries = data this.todayEntries = Array.isArray(data) ? data : []
this.showAllToday = false this.showAllToday = false
this.updateTodayDistances() this.updateTodayDistances()
}, },
@@ -701,8 +706,10 @@ export default {
params.merchantId = this.merchantId params.merchantId = this.merchantId
} }
const {data} = await shareDetailPageReq(params) const {data} = await shareDetailPageReq(params)
this.shareProducts = data.list // 后端分页接口失败时 data 为 undefined,直接取 data.list 会抛
this.shareProducts = this.shareProducts.filter(item => !!item.product).filter((item, index) => index < 48) // "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.showAllProducts = false
this.productKeyword = '' this.productKeyword = ''
this.productKeywordApplied = '' this.productKeywordApplied = ''