React Native集成Mobx时赋值数组遇[serializr]非原始值错误求助
解决serializr报错:"this value is not primitive: 14"
看起来你遇到的问题是serializr在序列化Task类中的tools数组时,无法正确识别数组元素的类型导致的。让我一步步帮你分析和解决:
错误原因
serializr的@persist装饰器默认不会自动推断数组元素的序列化规则——即使元素是像数字14这样的原始类型。当你直接给数组加上@persist而不指定元素类型时,serializr会尝试用默认的序列化逻辑处理,这就会触发"不是原始类型"的错误(尽管14本身是原始类型,但serializr不知道数组里的元素应该按原始类型处理)。
解决方案
1. 为数组指定正确的序列化规则
修改Task类中tools字段的装饰器,明确告诉serializr这是一个原始类型的数组:
import { persist, list, primitive } from 'serializr'; import { observable } from 'mobx'; class Task { @persist @observable id = ''; @persist @observable title = ''; @persist @observable description = ''; // 使用list(primitive())明确数组元素是原始类型 @persist(list(primitive())) @observable tools = []; constructor(id, title, description, tools) { this.id = id; this.title = title; this.description = description; // 确保赋值的是数组,若传入的是undefined/null,给个默认空数组 this.tools = tools || []; } }
如果你觉得list(primitive())太啰嗦,也可以使用简写的字符串形式(serializr支持部分类型的简写):
@persist('list') @observable tools = [];
2. 检查构造函数的赋值逻辑
确保你在实例化Task时,传入的tools参数确实是一个数组,而不是单个值(比如不小心传了14而不是[14])。这种情况也会触发类似的错误,因为serializr期望处理数组,却收到了单个原始值。
3. 确认Mobx与serializr的兼容性
如果你是直接给this.tools赋值普通数组,Mobx会自动将其转换为observable数组,这和serializr是兼容的。但如果你是手动操作observable数组(比如用push/replace),也没问题——serializr能正确处理Mobx的observable数组。
验证
修改后,重新测试赋值逻辑,比如:
const task = new Task('1', 'Test Task', 'Description', [14, 25, 36]); // 此时序列化这个task对象应该不会再报错
这样应该就能解决你遇到的serializr序列化错误了。
内容的提问来源于stack exchange,提问作者Manspof
相关产品推荐
相关产品推荐

