
hubilderx 版本:4.87

console.log(good.value.sku_goods) 可以看到:是个数组
UTS.JSON.stringify之后,sku_goods 成为 null了
由于我是后端,不了解前端原理,难道不能这么用?
于是我让 ai 参考写份 vue3 代码。
import { ref, watchEffect } from 'vue' const good = ref({ id: "1", sku_goods: [{ sku_spec_values: [ { name: "颜色", value: "红色" } ] }] }) // 创建响应式引用 const client_classify = ref(good.value.sku_goods) // 设置 id 为 client_classify 的引用(注意:这是数组引用) good.value.id = client_classify.value // 序列化 const jsOnString= JSON.stringify(good.value) console.log('Serialized:', jsonString) 没问题啊,sku_goods 是正常了。
让 ai 帮我分析,完全是浪费时间。
最后受不了,在编译后的小程序源码调试,才找到问题。
完全看不到 AppData 数据。
见:https://v2ex.com/t/1164720#r_17087022
调试是必须的,这么重要的功能,2025 了啊!
1 Yuunie 8 天前 小程序就不要用 x ,用 x 主要是为了 App ,他们根本不可能有这么多时间适配每一端的,推出了主要就是为了 App |
2 Yuunie 8 天前 不过用条件编译应该就解决了 |
3 molvqingtai 8 天前 大概率是 uni-appx 在序列化 proxy 时的 bug, 在序列化之前,使用 toRow 获取 proxy 的原始值试试 stringify(toRow(good.value.sku_goods)) |
4 molvqingtai 8 天前 fix typo: toRow -> toRaw |
5 lyxxxh2 OP @molvqingtai 确实是 proxy,刚用代码试了。 ``` <script setup lang="uts"> import { ref, toRaw } from 'vue' // 定义类型( uts 是强类型语言,需要类型定义) interface SkuSpecValue { name: string value: string } interface SkuGood { sku_spec_values: SkuSpecValue[] } interface GoodType { id: string | Array<any> // 注意:id 可能变为数组引用 sku_goods: SkuGood[] } // 创建响应式引用 const good = ref<GoodType>({ id: "1", sku_goods: [{ sku_spec_values: [ { name: "颜色", value: "红色" } ] }] }) // 创建响应式引用 - 注意:这里直接引用 good.value.sku_goods const client_classify = ref(good.value.sku_goods) // 设置 id 为 client_classify 的引用 good.value.id = client_classify.value // 序列化 const jsOnString= JSON.stringify(good.value) console.log('Serialized:', jsonString) // 以下是修复 // 批量转换为原始对象 来自:deepseek function convertAllToRaw(obj) { if (Array.isArray(obj)) { return obj.map(item => { if (item && typeof item === 'object') { return convertAlToRaw(toRaw(item)) } return item }) } else if (obj && typeof obj === 'object') { const result = {} for (const key in obj) { const value = obj[key] if (value && typeof value === 'object') { result[key] = convertAllToRaw(toRaw(value)) } else { result[key] = value } } return result } return obj } const jsOnStringFix= JSON.stringify( convertAllToRaw(good.value) ) console.log("fixed",jsonStringFix) </script> ``` ![]() 自己封装个 JSON.stringify 函数来修复就行。 |
6 lyxxxh2 OP 已经放弃 uniappx 。 原生或者 mpx,我选择了 mpx,体验还不错。 1. 安装自带 eslint - uniappx 根本没有 eslint,最近的一个官方 eslint 还是 2022 年更新的 - 最后还是在 github 找到了个 eslint,虽然能用,但是又不是针对 uts 的 2. appdata 不会乱码了。 我想 mpx 应该更稳定,专注小程序端。 uniappx 步子夸太大了,专为解决 app 性能而生吧。 然后又没足够精力去维护小程序,调试工具都没有。 在小程序开发完成,编译到 andorid 全是报错。 js 大量操作,在 kotlin 根本用不了。 按照文档的来强制写,应该可以。 建议出个 eslint 之类的,可以禁止 uts 使用 js 。 不然兼容的修改,够喝一壶了。 |