React类组件setState更新state对象后立即传参接口值为null问题
问题根因
React 类组件的 setState 是异步批量执行的,调用后不会立刻同步修改 this.state 上的值,同一轮同步执行逻辑里读取到的永远是更新前的旧状态快照。
你的代码存在两个直接问题:
- 在
saveDesign回调执行初期就解构出NewsletterDesign变量,这个变量存的是点击触发时还未更新DesignStructure的旧对象,后续state更新不会改变这个已经存下来的旧变量值 - 接口调用写在
setState执行逻辑外,没有等待state更新完成就发起请求,传参用的还是一开始拿到的旧对象,自然会出现其余字段正常、DesignStructure为null的情况
可行修复方案
方案1:直接拼接最新对象传参(推荐)
既然在 saveDesign 的回调里已经拿到了最新的 design 值,不需要等state更新完成再取,直接拼接出完整的最新对象即可,同时更新state、发起请求,逻辑最直接也不会有异步时序问题:
HandleClickSave () { this.editor.saveDesign((design) => { // 拼接得到最新的完整对象 const updatedDesign = { ...this.state.NewsletterDesign, DesignStructure: design } // 更新页面状态 this.setState({ NewsletterDesign: updatedDesign }) // 直接用最新对象调用接口 NewsletterService.UpdateCreateNewsletterDesign(updatedDesign) // 其余业务逻辑省略 }) }
方案2:利用setState完成回调取最新值
如果需要严格依赖state更新完成后再执行后续逻辑,可以把接口调用放到setState的第二个参数回调中,这个回调会在state更新落地、组件完成重渲染后触发,此时读取到的就是最新的state值:
HandleClickSave () { this.editor.saveDesign((design) => { this.setState(prevState => ({ NewsletterDesign: { ...prevState.NewsletterDesign, DesignStructure: design } }), () => { // 这里的逻辑会在state更新完成后执行,能拿到最新值 NewsletterService.UpdateCreateNewsletterDesign(this.state.NewsletterDesign) // 其余依赖最新state的业务逻辑写在这里 }) }) }
注意:类组件场景下,永远不要在调用
setState之后立刻同步读取this.state期望拿到更新后的值,只要没进入组件下一次render周期、或者没触发setState的完成回调,读到的都是旧状态。
内容的提问来源于stack exchange,提问作者kevmull
相关产品推荐
相关产品推荐

