You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native:点击按钮向Redux传参并跳转页面问题及解决

问题:点击按钮导航后Redux Reducer未触发,无法更新Store

我最近碰到个棘手的问题:想在按钮点击时先把数据存入Redux Store,再跳转到下一页。结果页面能正常跳转,但Redux的Reducer完全没触发,Store里的数据根本没更新。

初始问题代码

// 按钮绑定的 onPress 事件
<Components.ChampagneButton onPress={() => this.saveTypeAndGoToNextScreen(type)} />

// 最初的处理函数
saveTypeAndGoToNextScreen = type => { 
  this.saveType(type) 
  this.submit() 
}

saveType = type => this.props.onChange({ type })

submit = () => helpers.goToScreen('NewJobInfo', this.props)

// 组件与Redux的连接逻辑
export default helpers.connectToRedux( 
  state => ({ job: state.newJob }), 
  dispatch => ({ onChange: job => dispatch(actions.buildNewJob(job)) }) 
)(NewJobType)

问题原因分析

后来我才搞明白,虽然代码里写的是先调用saveType再执行submit导航,但同步执行的导航操作可能会导致组件在Redux Store完成更新前就被卸载——尤其是当导航是立即跳转(比如直接替换路由栈)时,组件的生命周期被中断,导致看起来Reducer没触发(其实可能已经触发了,但组件没机会感知到)。

可用解决方案(已验证)

调整函数的执行逻辑,确保Redux的状态更新完成后再触发导航。我这里直接优化了saveTypeAndGoToNextScreen的写法,保证状态更新优先完成:

// 优化后的处理函数
saveTypeAndGoToNextScreen = type => { 
  this.saveType(type)
  // 利用setTimeout让Redux完成状态更新后再导航
  setTimeout(() => this.submit(), 0)
}

// 其余代码保持不变
saveType = type => this.props.onChange({ type })

submit = () => helpers.goToScreen('NewJobInfo', this.props)

export default helpers.connectToRedux( 
  state => ({ job: state.newJob }), 
  dispatch => ({ onChange: job => dispatch(actions.buildNewJob(job)) }) 
)(NewJobType)

如果你的Redux使用了异步中间件(比如Thunk),也可以让saveType返回Promise,然后用async/await来确保顺序:

// 假设saveType是异步函数(比如action是Thunk)
saveType = async type => {
  await this.props.onChange({ type })
}

saveTypeAndGoToNextScreen = async type => { 
  await this.saveType(type)
  this.submit() 
}

这样调整后,就能保证先把数据成功存入Redux Store,再跳转到下一个页面了。

内容的提问来源于stack exchange,提问作者Brett S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:33:49