next.js useSWR mutate(undefined)不重新验证其它窗口

e3bfsja2  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(97)

我使用uswSWR来处理用户身份验证:

export function useAuthenticatedUser() {
    const { data, error, isLoading, mutate } = useSWR("user",
        UserApi.getAuthenticatedUser,
        {
            shouldRetryOnError(err) {
                return !(err instanceof UnauthorizedError)
            },
        }
    );
    return {
        user: data,
        userLoading: isLoading,
        userLoadingError: error,
        mutateUser: mutate,
    }
}

由于SWR的自动重新验证,当浏览器窗口或选项卡获得焦点时,将再次获取此用户。
问题:注销后重新验证不起作用:

const { mutateUser } = useAuthenticatedUser();
async function logout() {
    try {
        await UserApi.logout();
        mutateUser(undefined);
    } catch (error) {
        console.error(error);
        alert(error);
    }
}

此记录显示了实际问题。请注意,获得焦点的窗口在登录后重新生效,但在注销后不生效。

kb5ga3dv

kb5ga3dv1#

问题是,如果用户没有登录,我不会返回null。如果我使用null而不是undefined进行修改,则注销会正确传播。

export function useAuthenticatedUser() {
    const { data, error, isLoading, mutate } = useSWR("user",
        async () => {
            try {
                return await UsersApi.getAuthenticatedUser();
            } catch (error) {
                if (error instanceof UnauthorizedError) {
                    return null;
                } else {
                    throw error;
                }
            }
        }
    );

    return {
        user: data,
        userLoading: isLoading,
        userLoadingError: error,
        mutateUser: mutate,
    }
}

现在mutate接受null

const { mutateUser } = useAuthenticatedUser();
async function logout() {
    try {
        await UserApi.logout();
        mutateUser(null); // undefined won't propagate between tabs
    } catch (error) {
        console.error(error);
        alert(error);
    }
}

相关问题