You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js新router无法await导航:如何实现禁用按钮的类似效果?

解决Next.js App Router中无需自定义状态保持按钮禁用的问题

在App Router里,router.push不再返回Promise,但可以通过useNavigation钩子提供的导航状态来实现和旧版一样的按钮禁用效果,不用额外定义状态变量:

  1. 引入useNavigation钩子
    从next/navigation中导入useNavigation:

    import { useNavigation } from 'next/navigation';
    
  2. 获取导航状态
    在组件内初始化navigation对象:

    const navigation = useNavigation();
    
  3. 控制按钮禁用状态
    将按钮的disabled属性绑定到navigation.state === 'loading',这样导航过程中按钮会自动保持禁用:

    <button 
      type="submit" 
      disabled={navigation.state === 'loading'}
    >
      提交
    </button>
    
  4. 改造提交函数
    不用再await router.push,直接调用即可,导航状态会自动更新:

    async function onSubmit(input: CreatePostFormData) {
        try {
            await BlogApi.createBlogPost(input);
            router.push(`/blog/${slug}`); // 直接调用,无需await
        } catch (error) {
            console.error(error);
            alert(error);
        }
    }
    

原理是:调用router.push后,navigation.state会变成loading,直到页面导航完成后切换回idle,利用这个内置状态就能直接控制按钮的禁用状态,完全不需要自定义额外的状态变量。

内容的提问来源于stack exchange,提问作者Florian Walther

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 04:58:15