当前位置:首页 > JavaScript

js控制next实现

2026-04-07 11:02:38JavaScript

使用 Next.js 的 router 控制导航

Next.js 提供了 next/router 模块,可以通过编程方式控制页面跳转。安装 Next.js 后,直接引入 useRouter 钩子或 Router 对象。

import { useRouter } from 'next/router';

function MyComponent() {
  const router = useRouter();

  const handleNavigate = () => {
    router.push('/target-page'); // 跳转到指定路径
  };

  return <button onClick={handleNavigate}>跳转</button>;
}

支持动态路由参数传递:

router.push({
  pathname: '/post/[id]',
  query: { id: '123' },
});

动态加载页面(懒加载)

通过 next/dynamic 实现按需加载组件或页面,优化性能:

js控制next实现

import dynamic from 'next/dynamic';

const DynamicComponent = dynamic(() => import('../components/MyComponent'), {
  loading: () => <p>Loading...</p>, // 可选加载状态
});

function HomePage() {
  return <DynamicComponent />;
}

路由事件监听

监听路由变化事件(如开始跳转、完成跳转):

useEffect(() => {
  const handleStart = (url) => console.log(`Loading: ${url}`);
  const handleComplete = () => console.log('Navigation complete');

  router.events.on('routeChangeStart', handleStart);
  router.events.on('routeChangeComplete', handleComplete);

  return () => {
    router.events.off('routeChangeStart', handleStart);
    router.events.off('routeChangeComplete', handleComplete);
  };
}, [router]);

重定向与路由守卫

getServerSideProps 或中间件中实现服务端重定向:

js控制next实现

export async function getServerSideProps(context) {
  const { req } = context;
  if (!req.cookies.token) {
    return {
      redirect: {
        destination: '/login',
        permanent: false,
      },
    };
  }
  return { props: {} };
}

客户端路由守卫可通过高阶组件(HOC)实现:

function withAuth(WrappedComponent) {
  return (props) => {
    const router = useRouter();
    const [isAuthenticated, setIsAuthenticated] = useState(false);

    useEffect(() => {
      if (!isAuthenticated) router.push('/login');
    }, [isAuthenticated]);

    return <WrappedComponent {...props} />;
  };
}

修改 URL 而不触发导航

使用 router.replace 替换当前历史记录条目:

router.replace('/new-url'); // 类似于重定向

获取当前路由信息

通过 router 对象访问当前路径、查询参数等:

const { pathname, query, asPath } = router;
console.log(pathname); // 输出当前路径(如 "/about")

注意事项

  • 动态路由需提前在 pages 目录下配置(如 pages/post/[id].js)。
  • 服务端渲染时,router 相关操作需在客户端生命周期(如 useEffect)中执行。
  • 使用 next/link 组件处理常规导航可优化性能(预加载)。

标签: jsnext
分享给朋友:

相关文章

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

js验证码实现

js验证码实现

验证码的基本原理 验证码(CAPTCHA)用于区分人类用户和自动化程序。常见类型包括图形验证码、滑动验证码、短信验证码等。JavaScript 可用于前端验证码的生成和验证逻辑。 图形验证码实现 使…