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:
+16
-9
@@ -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 = ''
|
||||
|
||||
Reference in New Issue
Block a user