作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个自定义钩子(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');
}
}
但这只会导致相同的错误。
最佳答案
发生错误是因为 router.push
在页面首次加载的 SSR 期间在服务器上被调用。一种可能的解决方法是扩展您的自定义 Hook 以调用 router.push
在 useEffect
内的回调,确保 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/
我有一个自定义钩子(Hook),可以检查您是否已登录,如果未登录,则将您重定向到登录页面。这是我的钩子(Hook)的伪实现,假设您没有登录: import { useRouter } from 'ne
我是一名优秀的程序员,十分优秀!