当使用相同的值调用 setState 时,条件重新渲染是重新渲染

Conditional re-render is re-rendering when setState is called with same value

每次我在 isSignedIn 上调用 setState 即使值没有改变,它似乎也在重新渲染并将屏幕设置回堆栈的初始屏幕。

const {isAuthenticated, isVerified} = useAuth();
const [isSignedIn, setIsSignedIn] = useState(false);

useEffect(() => setIsSignedIn(isVerified && isAuthenticated), [isAuthenticated, isVerified]);

<NavigationContainer>
  <Root.Navigator initialRouteName={initialRouteName}>
    {!isSignedIn ? (
      <Root.Screen
        name="Auth"
        component={AuthStack}
        options={globalOptions}
      />
    ) : (
      <>
        <Root.Screen
          name="Tab"
          component={TabStack}
          options={globalOptions}
        />
      </>
    )}
  </Root.Navigator>
</NavigationContainer>

这可能有帮助

useEffect(() => {
  if( isVerified && isAuthenticated ){
    setIsSignedIn(true);
  }
 }, [isAuthenticated, isVerified]
);

想通了。我设置 isVerified 的方式有问题,它会先设置为 true 然后再设置为 false。

我的身份验证提供商中的问题代码:

function updateIsVerified(user) {
    if (attemptedLoginMethod === 'facebook') {
      setIsVerified(true);
    } else {
      setIsVerified(user?.emailVerified ?? false);
    }

在调用 updateIsVerified 之前未将 attemptedLoginMethod 设置为正确的方法。