gpt4 book ai didi

javascript - Next.js 内联脚本只加载一次

转载 作者:行者123 更新时间:2023-12-05 00:38:44 27 4
gpt4 key购买 nike

我已经实现了Tiny Slider在我的 Next.js 应用程序中,它需要页面上的内联脚本来控制 slider 的行为。现在,虽然脚本在我第一次启动 index.js 时正确加载,但是每当我使用 Link 导航到另一个页面并返回 index.js 时,脚本都不会加载。
这是我在 index.js 中编写脚本的方式

 {/* Script */}
<Script id='tester'>
{`
var slider = tns({
container: '.my-slider',
items: 6,
autoplay: true,
autoplayTimeout: 2000,
gutter: 20,
autoplayButtonOutput: false,
controls: false,
navPosition: 'bottom',
nav: false,
mouseDrag: true,
arrowKeys: true,
responsive: {
300: {
items: 2,
gutter: 50,
center: true,
fixedWidth: 250,
},
700: {
items: 3,
gutter: 50,
center: true,
fixedWidth: 250,
},
1440: {
items: 3,
gutter: 50,
fixedWidth: 250,
center: true,
}
}
});
`}
</Script>
我需要在每次加载 index.js 时加载脚本,而不仅仅是第一次加载。关于如何做到这一点的任何想法?完整的代码在这里 - https://github.com/YaddyVirus/Esttheva

最佳答案

以下是将 tina-slider 添加到 next.js 应用程序的步骤。

  • 添加 pages/_document.js 以加载样式

  • // pages/_document.js
    import { Html, Head, Main, NextScript } from 'next/document'

    export default function Document() {
    return (
    <Html>
    <Head>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tiny-slider/2.9.2/tiny-slider.css" />
    </Head>
    <body>
    <Main />
    <NextScript />
    </body>
    </Html>
    )
    }
  • 这是加载 slider
  • 的示例页面

    import { useEffect, useRef } from "react";

    const App = () => {
    const ref = useRef(true);

    useEffect(() => {
    let slider;
    // Tiny slider only can be loaded once and can only be loaded clint side
    if (typeof window !== "undefined" && ref.current) {
    ref.current = false;
    // Lazy load the slider code client side
    import("tiny-slider").then((x) => {
    slider = x.tns({
    container: ".slider",
    items: 3,
    slideBy: "page",
    autoplay: true
    });
    });
    }
    // Destory the slider when it is unmouted
    return slider?.destroy();
    }, []);

    return (
    <div>
    <div className="slider">
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div>
    <div>6</div>
    </div>
    </div>
    );
    };

    export default App;
    代码沙箱链接: https://codesandbox.io/s/tina-slider-nextjs-0z8zi6?file=/pages/index.js:0-806
    这是有关解决方案的几个关键说明
  • ref跟踪钩子(Hook)是否已被调用(截至 react 18 钩子(Hook)在开发模式下被调用两次)
  • 我们使用 typeof window !== "undefined"确保小窗口只加载客户端和不是 在服务器上(这会导致“窗口未定义”错误)
  • 我们调用tns功能 as per the docs
  • 关于javascript - Next.js 内联脚本只加载一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72580914/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com