From 1ac0fb248476cf0467ab20599d2dc5e7f2c4818e Mon Sep 17 00:00:00 2001 From: ZF sun <34314687@qq.com> Date: Sat, 18 Jul 2026 10:34:37 +0800 Subject: [PATCH] =?UTF-8?q?refactor(goods-detail):=20=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E5=95=86=E5=93=81=E7=95=99=E8=A8=80=E8=A1=A8=E5=8D=95=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E4=B8=8E=E6=8E=A5=E5=8F=A3=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 将原有的同步调用改为异步处理handleGoodsSkuData和getGoodsForm方法 2. 重构getGoodsForm接口请求逻辑,兼容新旧版接口返回格式 3. 新增goods_form_config字段支持新表单组件样式配置 4. 替换旧版ns-form为ns-newform组件,完善空数据兜底处理 5. 优化商品留言初始化的可选链操作避免空指针报错 --- common/js/goods_detail_base.js | 32 +++++++++++++++++++++++++------- pages_goods/detail.vue | 6 +++++- pages_goods/public/js/detail.js | 4 ++-- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/common/js/goods_detail_base.js b/common/js/goods_detail_base.js index b37dc85..55e2d98 100644 --- a/common/js/goods_detail_base.js +++ b/common/js/goods_detail_base.js @@ -79,7 +79,7 @@ export default { }, methods: { // 处理商品详情数据 - handleGoodsSkuData() { + async handleGoodsSkuData() { // this.navbarData.title = this.goodsSkuDetail.goods_name.length > 9 ? this.goodsSkuDetail.goods_name.substr(0, 9) + "..." : this.goodsSkuDetail.goods_name; //设置标题 // this.$langConfig.title(this.navbarData.title); @@ -186,7 +186,7 @@ export default { // this.getBarrageData(); if (this.addonIsExist.form) { - this.getGoodsForm(); + await this.getGoodsForm(); } }, /** @@ -321,17 +321,35 @@ export default { }, /** * 获取商品表单 + * 后端与 /form/api/form/info 对齐:res.data = {json_data:[...组件], form_config:{...样式(camelCase)}} + * - 把组件数组塞进 goodsSkuDetail.goods_form(保持下游 用法不变) + * - 把 form_config 单独存到 goodsSkuDetail.goods_form_config,下游 消费 + * 历史扁平数组兼容:若后端还是返回 list 形态(旧实现),form_config 留空,走 ns-form 默认值。 + * 数据兜底:res.data 为 null(商品没绑表单)时也初始化为空数组 + 空对象, + * 避免下游 v-bind 把 undefined 传给 ns-newform 的 Array-typed :data prop。 */ - getGoodsForm() { - this.$api.sendRequest({ + async getGoodsForm() { + const res = await this.$api.sendRequest({ url: "/form/api/form/goodsform", data: { goods_id: this.goodsSkuDetail.goods_id }, - success: res => { - if (res.code == 0 && res.data) this.$set(this.goodsSkuDetail, 'goods_form', res.data); - } + async: false }); + if (!res || res.code != 0 || !res.data) { + // 商品没绑表单 / 接口报错:保持 goods_form 是空数组,避免下游 type 警告 + this.$set(this.goodsSkuDetail, 'goods_form', []); + this.$set(this.goodsSkuDetail, 'goods_form_config', {}); + return; + } + if (Array.isArray(res.data)) { + // 旧版扁平数组兼容 + this.$set(this.goodsSkuDetail, 'goods_form', res.data); + this.$set(this.goodsSkuDetail, 'goods_form_config', {}); + } else { + this.$set(this.goodsSkuDetail, 'goods_form', res.data.json_data || []); + this.$set(this.goodsSkuDetail, 'goods_form_config', res.data.form_config || {}); + } } }, /** diff --git a/pages_goods/detail.vue b/pages_goods/detail.vue index 46335b0..1eb63bb 100644 --- a/pages_goods/detail.vue +++ b/pages_goods/detail.vue @@ -411,7 +411,11 @@ --> - + diff --git a/pages_goods/public/js/detail.js b/pages_goods/public/js/detail.js index a04d65f..c9c90ea 100644 --- a/pages_goods/public/js/detail.js +++ b/pages_goods/public/js/detail.js @@ -156,7 +156,7 @@ export default { }; // 处理商品数据 - this.handleGoodsSkuData(); + await this.handleGoodsSkuData(); // 限时折扣 if (this.goodsSkuDetail.promotion_type == 1 && this.addonIsExist.discount) { @@ -221,7 +221,7 @@ export default { //商品留言打开 showinformation(){ - this.informationform = this.goodsSkuDetail.goods_form + this.informationform = this.goodsSkuDetail?.goods_form ?? []; this.$refs.informationPopup.open(); }, //商品留言关闭