reactjs - 在 react-admin 中未经身份验证时,如何防止仪表板内容闪烁?

标签 reactjs authentication routes react-admin

据一位较早的 comment以及我在我的应用程序中遇到的情况,在重定向到并显示登录对话框之前,react-admin 可能会在短时间内未通过身份验证时显示仪表板。

The AUTH_CHECK call is asynchronous, and the response can come with a long delay. We choose to render the dashboard even though the response from the AUTH_CHECK call hasn't come yet. We've adopted this strategy for performance reasons (it's called optimistic rendering).



但是,他们的演示应用程序设法在短时间内不显示仪表板。它立即显示登录表单。
  • 转至 demo app并使用演示/演示登录
  • 等待仪表板显示
  • 清除本地存储和 cookie
  • 在浏览器控制台 (Chrome) 中降低 CPU x6 和网络速度以降低 3G
  • 点击刷新。您没有看到仪表板,但立即会看到登录对话框

  • 他们在他们的演示应用程序中实现了什么来实现在未经身份验证的情况下短暂地看不到仪表板?因为这也是我想在我的应用程序中完成的。

    以下内容可能是一个红鲱鱼,但如果您发现我的 authProvider 配置有问题导致仪表板在我的应用程序中未经身份验证时短暂显示,则会为您加分。
    const authProvider = {
        login: ({ username, password }) => {
            return fetchUtils
                .fetchJson(`${uri}/login`, {
                    method: 'POST',
                    credentials: 'include',
                    body: JSON.stringify({ username, password }),
                })
                .then(({ status, body, json }) => {
                    if (status < 200 || status >= 300) {
                        throw new Error(body);
                    }
                    localStorage.setItem('me', JSON.stringify(json));
                });
        },
        logout: () => {
            localStorage.removeItem('me');
    
            return fetchUtils
                .fetchJson(`${uri}/signout`, {
                    method: 'POST',
                })
                .then(() => {
                    return Promise.resolve(/*loginUrl*/);
                })
                .catch(err => {
                    console.log('Error, while requesting signout', err);
                    return Promise.resolve();
                });
        },
        checkError: params => {
            let isAuthError;
            try {
                isAuthError = params.networkError.result.errors.some(
                    e => e.extensions.code === 'UNAUTHENTICATED'
                );
            } catch (e) {
                //
            }
    
            if (isAuthError) {
                localStorage.removeItem('me');
                return Promise.reject();
            }
            return Promise.resolve();
        },
        checkAuth: () => {
            return localStorage.getItem('me')
                ? Promise.resolve()
                : Promise.reject();
        },
        getPermissions: () => {
            const { role } = JSON.parse(localStorage.getItem('me') || '{}');
            return role ? Promise.resolve(role) : Promise.reject();
        },
    }
    

    最佳答案

    我们没有为此做任何特别的事情。我怀疑这里有些 react 巫毒。

    您可能已经看到 dataProvider 初始化是异步的,在初始化之前,我们展示了一个简单的加载器。 也许 资源和路由初始化在 React 将渲染结果应用于 DOM 之前进行,并且重定向优先。

    关于reactjs - 在 react-admin 中未经身份验证时,如何防止仪表板内容闪烁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62383779/

    相关文章:

    javascript - 如何将 Storybook 配置为从项目根目录以外的目录运行

    node.js - Passport.js 失败消息未出现

    symfony - 如何知道谁在 symfony 中调用了 Controller 的操作

    c# - ASP.NET Web API 2 -> Windows 身份验证 -> 在 Azure 上模拟 Windows 用户

    java - Spring REST 应用程序中身份验证的最佳方式

    asp.net-mvc - .NET MVC 获取路由模板

    android - 通过听筒播放录制的文件

    javascript - 导出函数中的全局变量不可访问

    javascript - React Router Dom v6 中的重定向

    reactjs - 错误 : The result of this StaticQuery could not be fetched - Gatsby