防止React Suspense中Await的重新渲染

问题描述 投票:0回答:1

我正在使用React中的Suspense,等待react-router等待promise并在解析时返回JSX,但在大多数情况下我想调用一些函数,例如导航或其他函数,然后这些函数被调用两次,我想防止这种情况发生

检查这个:

      export const Loader = async ({ params }) => {
                CheckAuth();
                let fetch_data = fetchApi('auth/activate-account', 'POST', { verify_token: params.verify_token });
                return defer({ loaderPromise: fetch_data });
            }
    //this loader is called in the Route loader prop
        
        const VerifyToken = () => {
        
            const loaderData = useLoaderData();
        
            const navigate = useNavigate();
        
            const { showAlert } = useGeneral();
        
            return (
                <React.Suspense fallback={<PreLoader />}>
                    <Await resolve={loaderData.loaderPromise}>
                        {(resolvedData) => {
                            if (resolvedData.type === "warning") {
                                showAlert(resolvedData.type, resolvedData.msg);
                                navigate('/Auth/Login', { replace: true });
                               return null;
                            }
                            return (
                                { JSX }
                            );
                        }}
                    </Await>
                </React.Suspense>
            );
    
    
    };

这会导致调用导航和 showAlert 函数两次,我想阻止这种情况或使用其他方法或其他方法。

我试过这个:

 let loaderRef = React.useRef(false);

     <React.Suspense fallback={<PreLoader />}>
            <Await resolve={loaderData.loaderPromise}>
                {(resolvedData) => {
                    if (!loaderRef.current) {
                        showAlert(resolvedData.type, resolvedData.msg);
                        loaderRef.current = true;
                        setTimeout(() => {
                            navigate('/Auth/Login', { replace: true });
                        }, 0);
                        return null;
                    }
                }}
            </Await>
        </React.Suspense>

这有效,但在大多数情况下效率不高。所以我希望我能在这里得到一些帮助

reactjs react-router react-suspense
1个回答
0
投票

我没有完整的图片来帮助你,但我会尽力来客串 您在开发中是否在 StrictMode 中使用 React ? 它将使 React 为每个组件重新渲染两次,以避免错误

如果不是这种情况,请提供测试应用程序的方法

https://react.dev/reference/react/StrictMode#strictmode

严格模式支持以下仅限开发的行为:

你的组件将重新渲染额外的时间来查找不纯渲染引起的错误。 您的组件将重新运行 Effects 一段额外的时间,以查找因缺少 Effect 清理而导致的错误。 将检查您的组件是否使用了已弃用的 API。

© www.soinside.com 2019 - 2024. All rights reserved.