javascript - 在 React 组件之外使用 NextRouter

标签 javascript reactjs next.js next-router

我有一个自定义钩子(Hook),可以检查您是否已登录,如果未登录,则将您重定向到登录页面。这是我的钩子(Hook)的伪实现,假设您没有登录:

import { useRouter } from 'next/router';

export default function useAuthentication() {

  if (!AuthenticationStore.isLoggedIn()) {
    const router = useRouter();
    router.push('/login'); 
  }
}
但是当我使用这个钩子(Hook)时,我得到以下错误:

Error: No router instance found. you should only use "next/router" inside the client side of your app. https://err.sh/vercel/next.js/no-router-instance


我检查了错误中的链接,但这并没有真正的帮助,因为它只是告诉我移动 push对我的渲染函数的声明。
我也试过这个:
// My functional component
export default function SomeComponent() {

  const router = useRouter();
  useAuthentication(router);

  return <>...</>
}

// My custom hook
export default function useAuthentication(router) {

  if (!AuthenticationStore.isLoggedIn()) {
    router.push('/login');
  }
}
但这只会导致相同的错误。
有没有办法允许在 Next.js 中的 React 组件之外进行路由?

最佳答案

发生错误是因为 router.push在页面首次加载的 SSR 期间在服务器上被调用。一种可能的解决方法是扩展您的自定义 Hook 以调用 router.pushuseEffect 内的回调,确保 Action 只发生在客户端。

import { useEffect } from 'react';
import { useRouter } from 'next/router';

export default function useAuthentication() {
    const router = useRouter();

    useEffect(() => {
        if (!AuthenticationStore.isLoggedIn()) {
            router.push('/login'); 
        }
    }, []);
}
然后在您的组件中使用它:
import useAuthentication from '../hooks/use-authentication' // Replace with your path to the hook

export default function SomeComponent() {
    useAuthentication();

    return <>...</>;
}

关于javascript - 在 React 组件之外使用 NextRouter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63797659/

相关文章:

reactjs - Next.js 带路由的多步表单

javascript - C3 中的换行符通过 JavaScript 生成 SVG 图表

javascript - 监视 Jasmine-Jquery 函数调用

javascript - Bootstrap 在 React 中行为不正确

reactjs - 如何在 NextJS 配置文件中组合多个加载器(CSS、LESS、ttf 等)?

javascript - 改变 react 中的状态

javascript - 无法使用 ChakraUI 中的 useDisclosure() 在同一页面上使用两个模态

javascript - 在Nodejs Sequelize模型中,如何获取属性的类型信息?

javascript - 使用 jQuery 在太长的 header 中添加中断

reactjs - 我可以在 nextjs 中使用没有 express 的 multer 吗?