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

React Navigation中Stack Navigator头部右侧组件内useState状态不更新问题

解决React Navigation Stack Navigator头部组件状态不更新的问题

这个问题其实是JavaScript闭包陷阱导致的,我来给你拆解清楚原因和解决办法:

问题根源

你在useLayoutEffect里设置了headerRight,但依赖数组是[]——这意味着这个effect只会在组件挂载时执行一次。此时SubmitButton组件捕获的是count的初始值(0),后续点击按钮更新count时,useLayoutEffect不会重新运行,headerRight的组件也不会重新创建,所以它一直拿着最初的闭包值,自然不会同步显示最新的计数。

解决方案

方法一:将count加入useLayoutEffect的依赖数组

当count变化时,让useLayoutEffect重新执行,重新设置headerRight,这样新的SubmitButton就能捕获到最新的count值:

const [count, setCount] = useState(0)

useLayoutEffect(() => {
  navigation.setOptions({
    headerRight: () => <SubmitButton />,
  });
}, [count, navigation]); // 把count添加到依赖数组中

const SubmitButton = () => {
  return (
    <Text>count: {count}</Text>
  );
};

return(
  <Button onPress={()=>{setCount(prev => prev + 1)}} title="增加计数" />
)

额外建议:把setCount(count+1)改成setCount(prev => prev + 1),这样在并发更新场景下更可靠,避免状态更新依赖旧值的潜在问题。

方法二:将count作为props传递给SubmitButton

如果你不想频繁重新设置headerOptions,也可以把count作为props传入,让组件的依赖关系更明确:

const [count, setCount] = useState(0)

useLayoutEffect(() => {
  navigation.setOptions({
    headerRight: () => <SubmitButton count={count} />,
  });
}, [count, navigation]);

const SubmitButton = ({ count }) => {
  return (
    <Text>count: {count}</Text>
  );
};

return(
  <Button onPress={()=>{setCount(prev => prev + 1)}} title="增加计数" />
)

这种方式让SubmitButton的状态来源更清晰,也方便后续扩展组件功能。

额外提醒

如果你使用的是React Navigation 6+,还有更灵活的方式处理头部组件状态,比如直接在屏幕组件的返回值中配置headerRight,不过上面两种方法已经能完美解决你当前的问题啦。

内容的提问来源于stack exchange,提问作者Arnav Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:02:46