当前位置:首页 > 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 实现按需加载组件或页面,优化性能:

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 或中间件中实现服务端重定向:

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 对象访问当前路径、查询参数等:

js控制next实现

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

注意事项

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

标签: jsnext
分享给朋友:

相关文章

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js 实现继承

js 实现继承

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

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 /…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <…