如何在useEffect中更新状态的条件组件中有条件地渲染?

康齐262

在react中,我有一个私有路由组件,该组件的isAuthenticated状态值用于呈现要包装的组件或重定向回我的登录页面。

为了检测刷新并执行身份验证检查,我添加了一个useEffect挂钩,希望可以检查身份验证状态,然后进行update isAuthenticated,然后返回组件或进行相应的重定向。

const PrivateRoute: React.FC<IPrivateRouteProps> = (props) => {
    const dispatch = useDispatch();
    const [isAuthenticated, setIsAuthenticated] = React.useState(false);

    useEffect(() => {
        authService.getIdentity().then(response => {
            if (response) {
                dispatch(signIn(new Identity(response.account)));
                setIsAuthenticated(true);
            } else {
                setIsAuthenticated(false);
            }         
        });
    }, [])

    return isAuthenticated ? (
        <Route {...props} component={props.component} render={undefined} />
    ) : (
        <Redirect to={{ pathname: props.redirectPath }} />
    );
};

不幸的是,这不起作用,我不确定为什么或如何解决它。

isAuthenticated呈现时的值始终为false,并且在控制台中出现以下错误...。

index.js:1 Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.
    in PrivateRoute (at App.tsx:23)

我可以确认它确实流向了,setIsAuthenticated(true)但这从没有反映在isAuthenticated渲染之前的值中

我如何/应该解决这个问题?

谢谢,

马巴哈莫

我认为问题在于代码第一次运行时,它使用isAuthenticated false评估渲染,然后使用useEffect并尝试更新值,但是您已经被重定向到另一页了。

我建议使用另一个变量来了解身份验证是否已通过,并且仅在身份验证完成后才继续。

const PrivateRoute: React.FC<IPrivateRouteProps> = (props) => {
    const dispatch = useDispatch();
    const [loading, setLoading] = React.useState(true);
    const [isAuthenticated, setIsAuthenticated] = React.useState(false);

    useEffect(() => {
        authService.getIdentity().then(response => {
            if (response) {
                dispatch(signIn(new Identity(response.account)));
                setIsAuthenticated(true);
            } else {
                setIsAuthenticated(false);
            }
            setLoading(false);         
        });
    }, [])

    if (isLoading) {
        //we are not ready yet
       return null;
    }

    return isAuthenticated ? (
        <Route {...props} component={props.component} render={undefined} />
    ) : (
        <Redirect to={{ pathname: props.redirectPath }} />
    );
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在无状态组件中有条件地更新状态?

来自分类Dev

如何在Angular中有条件地渲染?

来自分类Dev

如何在redux-form的<Field>中有条件地渲染组件

来自分类Dev

在 React 组件中有条件地渲染 <td>

来自分类Dev

在父类传递的事件处理程序中有条件地更新子组件的状态

来自分类Dev

如何有条件地渲染原因反应组件?

来自分类Dev

如何有条件地渲染 Angular 组件

来自分类Dev

有条件地渲染 aframe 中的组件

来自分类Dev

如何在Vuejs中有条件地渲染屏幕?

来自分类Dev

如何在 Vue.js 中有条件地渲染元素?

来自分类Dev

如何在Excel中有条件地匹配

来自分类Dev

如何在Excel中有条件地VLOOKUP?

来自分类Dev

如何在有条件的js中有条件地应用标题

来自分类Dev

如何在React中有条件地将布局应用于组件

来自分类Dev

有条件地渲染JSX的React组件的更新周期如何表现?

来自分类Dev

如何有条件地渲染

来自分类Dev

如何在For循环中有条件地更新多个类别的值

来自分类Dev

如何在有条件的组件上有条件地添加道具?

来自分类Dev

基于状态在React JS中有条件地渲染内容

来自分类Dev

在React JSX中有条件地渲染组件部分

来自分类Dev

如何在R中的数据框中有条件地选择列

来自分类Dev

如何在Meteor 1.0中有条件地加载/捆绑CSS文件?

来自分类Dev

如何在Django Admin 1.5中有条件地否决删除尝试?

来自分类Dev

如何在Visual Studio 2019中有条件地编译c ++源文件?

来自分类Dev

如何在熊猫中有条件地填充列中的空值

来自分类Dev

如何在ansible中有条件地从注册的json输出中获取值

来自分类Dev

如何在React中有条件地将子组件添加到父组件?

来自分类Dev

如何在另一个组件中有条件地添加组件

来自分类Dev

如何在React Native中有条件地从三个不同的选项进行渲染?

Related 相关文章

  1. 1

    如何在无状态组件中有条件地更新状态?

  2. 2

    如何在Angular中有条件地渲染?

  3. 3

    如何在redux-form的<Field>中有条件地渲染组件

  4. 4

    在 React 组件中有条件地渲染 <td>

  5. 5

    在父类传递的事件处理程序中有条件地更新子组件的状态

  6. 6

    如何有条件地渲染原因反应组件?

  7. 7

    如何有条件地渲染 Angular 组件

  8. 8

    有条件地渲染 aframe 中的组件

  9. 9

    如何在Vuejs中有条件地渲染屏幕?

  10. 10

    如何在 Vue.js 中有条件地渲染元素?

  11. 11

    如何在Excel中有条件地匹配

  12. 12

    如何在Excel中有条件地VLOOKUP?

  13. 13

    如何在有条件的js中有条件地应用标题

  14. 14

    如何在React中有条件地将布局应用于组件

  15. 15

    有条件地渲染JSX的React组件的更新周期如何表现?

  16. 16

    如何有条件地渲染

  17. 17

    如何在For循环中有条件地更新多个类别的值

  18. 18

    如何在有条件的组件上有条件地添加道具?

  19. 19

    基于状态在React JS中有条件地渲染内容

  20. 20

    在React JSX中有条件地渲染组件部分

  21. 21

    如何在R中的数据框中有条件地选择列

  22. 22

    如何在Meteor 1.0中有条件地加载/捆绑CSS文件?

  23. 23

    如何在Django Admin 1.5中有条件地否决删除尝试?

  24. 24

    如何在Visual Studio 2019中有条件地编译c ++源文件?

  25. 25

    如何在熊猫中有条件地填充列中的空值

  26. 26

    如何在ansible中有条件地从注册的json输出中获取值

  27. 27

    如何在React中有条件地将子组件添加到父组件?

  28. 28

    如何在另一个组件中有条件地添加组件

  29. 29

    如何在React Native中有条件地从三个不同的选项进行渲染?

热门标签

归档