微信小程序排坑,本地存储数据解析后字符带双引号,userName: JSON.stringify(wx.getStorageSync('userInfo').userName

本文介绍了一个关于微信小程序中使用wxStorage存储和读取数据时遇到的问题:读取到的数据带有双引号,导致数据解析错误。通过正确的使用JSON.parse和JSON.stringify方法,可以在存储时去除双引号,确保数据的正确读取。
userName: JSON.stringify(wx.getStorageSync('userInfo').userName),

得到的数据解析后带双引号,
这真是一个气吐血的坑。
需要在往storage种存储的时候使用

 wx.setStorageSync('userInfo',JSON.parse(userInfo))

再解析

userName: wx.getStorageSync('userInfo').userName,

就能得到正常的数据了

<think> 我们正在处理微信小程序中的代码报错问题。用户提供的代码片段是: `this.setData({`${formType.value}Json`: JSON.stringify(formData)})` 在JavaScript中,对象字面量的键名如果是动态的,需要使用方括号([])来包裹表达式。但是,在微信小程序的`setData`方法中,我们传递的是一个对象,这个对象的键可以是动态的,但必须使用正确的语法。 用户代码中使用了模板字符串(`${formType.value}Json`)作为键,但是它在对象字面量中直接这样写是不正确的。应该使用计算属性名(computed property name)的语法,即用方括号将表达式括起来。 因此,正确的写法应该是: ```javascript this.setData({ [`${formType.value}Json`]: JSON.stringify(formData) }) ``` 这样,键名就会被计算为`formType.value`的值加上字符串"Json",例如,如果`formType.value`为"user",则键名为"userJson"。 另外,需要注意的是,在微信小程序中,`setData`设置的键名不能包含特殊字符(如点号等),但这里我们使用的是变量拼接字符串,只要`formType.value`的值是合法的(不包含点号等),就没有问题。 下面我们详细解释一下: 1. **原始错误代码**: ```javascript this.setData({`${formType.value}Json`: JSON.stringify(formData)}) ``` 这种写法会导致语法错误,因为对象字面量的键名不能直接使用模板字符串。 2. **正确写法**: ```javascript this.setData({ [`${formType.value}Json`]: JSON.stringify(formData) }) ``` 使用方括号将模板字符串括起来,表示这是一个计算属性名。 3. **注意事项**: - 确保`formType.value`的值是一个字符串,并且不包含点号(`.`),因为点号在`setData`中用于表示嵌套路径。如果`formType.value`可能包含点号,那么需要避免,或者使用其他方式(例如,用下划线代替点号)来构造键名。 - 另外,确保`formData`是可转换为JSON的对象,否则`JSON.stringify`可能会抛出异常。 如果用户需要动态设置多个字段,也可以使用类似的方式,例如: ```javascript this.setData({ [key1]: value1, [key2]: value2 }); ``` 因此,解决用户报错的方法就是将键名用方括号括起来,内部使用模板字符串。 最后,参考用户提供的引用[3]中提到的,使用`JSON.stringify`将对象转换为JSON字符串是常见的做法,这里我们也是这么做的。 所以,修改后的代码应该是: ```javascript this.setData({ [`${formType.value}Json`]: JSON.stringify(formData) }); ``` 这样修改后,代码应该就不会报错了。 </think> 针对微信小程序中 `this.setData({`${formType.value}Json`: JSON.stringify(formData)})` 报错的问题,解决方案如下: ### 错误原因分析 1. **模板字符串语法错误**:在对象字面量中直接使用模板字符串 `{${key}: value}` 不符合 JavaScript 语法规范 2. **键名动态生成限制**:微信小程序 `setData` 要求键名必须是静态字符串或合法标识符 3. **特殊字符问题**:模板生成的键名可能包含小程序不允许的特殊字符(如`.`) ### 解决方案 #### ✅ 方法 1:使用计算属性名(推荐) ```javascript const key = `${formType.value}Json`; this.setData({ [key]: JSON.stringify(formData) }); ``` **原理**:通过 `[变量]` 语法动态生成键名,符合 ES6 规范 #### ✅ 方法 2:预拼接键名字符串 ```javascript const jsonKey = formType.value + 'Json'; this.setData({ [jsonKey]: JSON.stringify(formData) }); ``` #### ✅ 方法 3:使用临时对象 ```javascript const tempObj = {}; tempObj[`${formType.value}Json`] = JSON.stringify(formData); this.setData(tempObj); ``` ### 注意事项 1. **键名合法性**:确保 `${formType.value}` 不包含特殊字符(如`.`),否则会导致报错 2. **JSON 转换**:`JSON.stringify()` 是正确做法,如引用[3]强调的 JSON 格式要求[^3] 3. **数据结构**:若 `formData` 包含函数或不可序列化值,需提前处理 4. **小程序限制**:单次 `setData` 数据大小不超过 1MB ### 示例修正代码 ```javascript // 获取动态键名 const dynamicKey = `${formType.value}Json`; // 创建待更新数据对象 const updateData = { [dynamicKey]: JSON.stringify(formData) }; // 执行数据更新 this.setData(updateData); ``` > ⚠️ 如引用[2][^2]和[3][^3]所示,涉及 JSON 序列化的操作必须确保数据可序列化,且注意避免嵌套过深的数据结构。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值