React Native中Redux无法更新变量值的技术求助
问题排查与解决:Redux状态无法更新
我仔细看了你的代码,发现核心问题很明确:你只定义了Redux的Action和Reducer,但从来没有触发(dispatch)这个Action来更新状态。你的LoginScreen里只是通过useSelector读取了Redux的初始状态,但没有任何代码去调用testFunc这个Action,所以状态自然一直停留在初始值。
下面是具体的修复步骤:
1. 在组件中引入并使用useDispatch钩子
你需要在LoginScreen里导入Redux的useDispatch钩子,然后用它来触发你的testFunc Action。比如可以在登录按钮点击时触发,或者用useEffect在组件挂载时先测试:
修改后的LoginScreen代码片段:
import { useSelector, useDispatch } from 'react-redux'; // 新增useDispatch导入 import { testFunc } from '../../redux/actions/firebaseActions'; // 导入你的Action export default function LoginScreen() { const [disabled, setDisabled] = useState(false); const [userState, setUserState] = useState(initialUserState); const testRedux = useSelector(state => state.firebaseTest.theTestingString); const dispatch = useDispatch(); // 获取dispatch函数 const navigation = useNavigation(); // 可选:组件挂载时就触发Action,测试状态更新 useEffect(() => { dispatch(testFunc()); }, [dispatch]); console.log("当前Redux状态值: " + testRedux); // 每次组件渲染都会打印最新值 // ... 其他代码不变 return ( <View style={styles.container}> {/* ... 其他UI组件不变 */} <View style={styles.buttonRow}> <Button color={disabled ? "gray" : undefined} disabled={disabled} mode={'contained'} icon={'login'} onPress={() => { dispatch(testFunc()); // 点击按钮时触发Action console.log("点击按钮后的Redux值: " + testRedux); }} >Login</Button> </View> </View> ); }
2. 验证其他配置是否正确
你的Redux其他配置是没问题的:
- Store已经用
Provider包裹了整个应用,组件可以正确访问Redux状态 - Reducer里正确处理了
TEST_FUNC类型的Action,返回了新的状态对象(使用了扩展运算符...state来保留其他状态,这是正确的做法) useSelector的路径state.firebaseTest.theTestingString和你combineReducers里的key一致,没问题
关于之前Context的类似问题
你提到之前用Context也遇到类似问题,大概率也是同样的逻辑:你只读取了Context的初始值,但没有调用Context提供的更新函数去修改状态。本质都是“只读取不触发更新”的问题。
现在修改后,当你dispatchtestFuncAction后,Reducer会更新状态,组件会因为useSelector检测到状态变化而重新渲染,你就能看到最新的theTestingString值了。
内容的提问来源于stack exchange,提问作者Nicole Lopez
相关产品推荐
相关产品推荐

