React-Native中useSelector获取Redux状态始终返回初始值求助
Redux Toolkit迁移后useSelector获取值异常的解决方案
问题核心原因及修复步骤
1. setEmail reducer与调用参数不匹配
在redux/slices/auth.js的setEmail reducer中,你写的是state.email = action.payload.email,但在LoginScreen的TextInput里调用dispatch(setEmail(value))时,传入的value是字符串类型的邮箱,并非包含email字段的对象。这会导致action.payload.email为undefined,最终store里的email值被设为undefined——虽然TextInput会把undefined显示为空字符串,但实际上store并没有正确保存输入的邮箱内容,自然在按钮点击时拿不到正确值。
修复方式二选一:
- 修改
auth.js的reducer逻辑,直接使用传入的字符串值:
reducers: { setEmail: (state, action) => { state.email = action.payload; // 直接赋值传入的邮箱字符串 } }
- 或者在调用dispatch时传递包含
email字段的对象:
onChangeText={(value) => dispatch(setEmail({ email: value }))}
2. 未在组件中获取dispatch实例
在LoginScreen组件中,你直接使用了dispatch函数,但没有通过useDispatch() Hook获取它的实例。这会导致dispatch未定义,理论上会抛出错误,你提到TextInput能更新状态可能是实际代码中遗漏了这部分,但精简代码时没体现。
修复方法:
在组件内部添加useDispatch()调用:
function LoginScreen({navigation}) { const _email = useSelector(selectEmail); const dispatch = useDispatch(); // 新增该行获取dispatch实例 // 其余代码保持不变 }
额外确认
你的App.js已经将根组件正确包裹在Provider中,这部分没问题,但要确保LoginScreen是通过LoadingScreen正确导航进入的,保证它处于Redux上下文范围内。
修复以上问题后,useSelector获取的_email就能在按钮点击时拿到store中的最新值,而非初始状态。
内容的提问来源于stack exchange,提问作者Quantal
相关产品推荐
相关产品推荐

