在 React 组件之外使用 NextRouter
use NextRouter outside of React component
我有一个自定义挂钩,它会检查您是否已登录,如果未登录,则将您重定向到登录页面。这是我的钩子的伪实现,假设您没有登录:
import { useRouter } from 'next/router';
export default function useAuthentication() {
if (!AuthenticationStore.isLoggedIn()) {
const router = useRouter();
router.push('/login');
}
}
但是当我使用这个钩子时,我得到以下错误:
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
我检查了错误中的 link,但这并没有多大帮助,因为它只是告诉我将 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 组件之外进行路由吗?
创建一个 HOC,它将包装您的页面组件
import React, { useEffect } from "react";
import {useRouter} from 'next/router';
export default function UseAuthentication() {
return () => {
const router = useRouter();
useEffect(() => {
if (!AuthenticationStore.isLoggedIn()) router.push("/login");
}, []);
// yous should also add isLoggedIn in array of dependancy if the value is not a function
return <Component {...arguments} />;
};
}
主要成分
function SomeComponent() {
return <>...</>
}
export default UseAuthentication(SomeComponent)
import Router from 'next/router'
发生此错误是因为 router.push
在页面首次加载的 SSR 期间在服务器上被调用。一种可能的解决方法是扩展您的自定义挂钩以在 useEffect
的回调中调用 router.push
,确保该操作仅发生在客户端。
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 <>...</>;
}
我有一个自定义挂钩,它会检查您是否已登录,如果未登录,则将您重定向到登录页面。这是我的钩子的伪实现,假设您没有登录:
import { useRouter } from 'next/router';
export default function useAuthentication() {
if (!AuthenticationStore.isLoggedIn()) {
const router = useRouter();
router.push('/login');
}
}
但是当我使用这个钩子时,我得到以下错误:
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
我检查了错误中的 link,但这并没有多大帮助,因为它只是告诉我将 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 组件之外进行路由吗?
创建一个 HOC,它将包装您的页面组件
import React, { useEffect } from "react";
import {useRouter} from 'next/router';
export default function UseAuthentication() {
return () => {
const router = useRouter();
useEffect(() => {
if (!AuthenticationStore.isLoggedIn()) router.push("/login");
}, []);
// yous should also add isLoggedIn in array of dependancy if the value is not a function
return <Component {...arguments} />;
};
}
主要成分
function SomeComponent() {
return <>...</>
}
export default UseAuthentication(SomeComponent)
import Router from 'next/router'
发生此错误是因为 router.push
在页面首次加载的 SSR 期间在服务器上被调用。一种可能的解决方法是扩展您的自定义挂钩以在 useEffect
的回调中调用 router.push
,确保该操作仅发生在客户端。
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 <>...</>;
}