React Native中useState与useEffect交互的两个疑问咨询
问题解答
1. 为什么调用setValue后立即打印value仍为null
React的状态更新遵循批量异步更新规则:
- 单次渲染周期内的所有
setState调用会被统一收集,等到当前渲染的所有同步任务执行完成后才会批量处理,不会同步修改当前作用域下的状态变量。 - 函数组件每次渲染都会生成独立的作用域快照,本次渲染中所有位置访问的
value都是渲染初始化时确定的固定值,调用setValue只会触发组件重新渲染,下一次渲染时useState才会返回更新后的值,不会修改当前渲染作用域内的value。
如果需要获取刚设置的最新状态,直接使用你创建的myObject变量即可;如果需要监听状态更新后的时机,可以添加useEffect监听value变化,在回调中即可拿到更新后的状态。
2. 为什么状态不需要手动转换就是SpecialObject实例
你观察到的[object Object]打印结果不代表它是普通Object,原因如下:
- 所有没有重写
toString()方法的自定义类实例,默认调用toString()都会返回[object Object],你可以通过console.log(value instanceof SpecialObject)验证,运行后会输出true,证明它本身就是SpecialObject的实例。 - 你给
setValue传入的是直接通过new SpecialObject()创建的实例,整个过程没有做序列化、反序列化操作,React的状态存储会直接保留对象的原型链信息,不需要额外用plainToClass做类型转换。 - 补充:
useState后的TypeScript泛型标注仅做编译时的类型校验,不影响运行时的实际类型,你这里类型正确是因为存入的本身就是对应类的实例,和泛型标注无关。
额外提示:如果你后续对接AsyncStorage,因为AsyncStorage只能存储字符串,序列化后再取出的对象会丢失原型链变成普通Object,这种场景才需要使用
plainToClass转换为类实例。
内容的提问来源于stack exchange,提问作者Austin Brown
相关产品推荐
相关产品推荐

