【问题标题】:NextJs <Link> doesn't rerun scriptsNextJs <Link> 不会重新运行脚本
【发布时间】:2022-11-07 04:44:06
【问题描述】:

当我在 NextJs 中使用 &lt;Link&gt; 标记在页面之间导航时,它不会在更改页面后重新运行我的脚本。它仅在第一页加载后或我按重新加载时运行脚本。当使用普通的&lt;a&gt; 标签时,它可以正常工作,因为每次导航后页面都会重新加载。据我所知,这是因为&lt;Link&gt; 标签使它成为单页应用程序,并且在页面之间导航时不会刷新页面。

无论如何,我将非常感谢它在页面之间导航时重新运行脚本,或者让它刷新页面而不使用简单的&lt;a&gt; 标签并丢失单页应用程序功能。

此代码不会刷新页面

 <Link href="/page1">
   <a>Page 1</a>
 </Link>
 <Link href="/page2">
   <a>Page 2 </a>
 </Link>

此代码确实刷新页面

 <a href="/page1">Page 1</a>
 <a href="/page2">Page 2 </a>

我使用脚本组件加载所有脚本

export default const MyScripts = () => {
    
    return (
        <Script
            strategy="afterInteractive"
            type="module"
            src="/scripts/myScript.js"
            onReady={() => {
                console.log("Ready")
            }}
        /> 
    )
}

我注意到的一件事是,上述onReady 函数在我每次更改页面时都会触发。也许有人知道如何从onReady 运行myScript.js

【问题讨论】:

  • 你在哪里使用MyScripts 组件?
  • @KonradLinkowski 我在每页的 index.tsx 文件中使用它。就像任何其他组件一样。
  • 添加了一种可能的修复方法,我无法弄清楚如何实现(最后两句话)。

标签: javascript reactjs typescript next.js next-link


【解决方案1】:

可以尝试使用来自useRouter 钩子的router 对象。下面是你如何做到这一点:

export const YourComponent = () => {
  const router = useRouter();
  ...
  return (<>
    <button onClick={() => router.push({ pathname: '/page1' })}/>...</button>
    // Or you can also use a div if you don't want it behaving like a button
    <div onClick={() => router.push({ pathname: '/page1' })}/>...
  ...

如果这不起作用,那么我会检查Scripts 组件的代码在做什么以及它对状态的反应。

让我知道这是否有帮助!

【讨论】:

    【解决方案2】:

    我曾经this 来解决它。每次 URL 更改时,它都会重新运行您希望重新运行的内容。

    (function(history){
        var pushState = history.pushState;
        history.pushState = function(state) {
           // YOUR CUSTOM HOOK / FUNCTION
           console.log('I am called from pushStateHook');
           return pushState.apply(history, arguments);
        };
    })(window.history);
    

    我在 myScript.js 中的实现

    function urlChange (history){
    let pushState = history.pushState;
    history.pushState = function(state) {
        myFunctions();//I entered my code here
        return pushState.apply(history, arguments);
    };
    }(window.history);
    urlChange(history); //pretty sure this is what runs each time the url changes
    

    【讨论】:

    • 请注意,这将不再使用 Next.js 路由器进行页面导航。每个客户端导航都会触发一个完整的页面重新加载(这可能是解决脚本问题的原因)。
    • @juliomalves 不,这仍然使用 Nextjs 路由器。我只是将它放在外部脚本中,并将在每个页面重新加载时需要运行的所有功能放入“//您的自定义挂钩/功能”部分。我刚刚更新了答案以准确显示我是如何实现它的。
    猜你喜欢
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多