【问题标题】:Having a default image as a loading screen for nextjs将默认图像作为 nextjs 的加载屏幕
【发布时间】:2021-09-22 10:43:30
【问题描述】:

我想让我的背景作为下一个 js 中页面转换之间的加载屏幕。目前我有一个 Loader.js 文件来存储我的图像:-

import styles from './layout.module.css'

export default function Loader(){
    return(
        <div className={styles.loaderContainer}>
            <img src="../uploads/bg1080x1920.jpg" />
            <div>Loading ...</div> 
        </div>
    )

在我的 _app.js 中,我使用 next/router 来处理 routeChangeStart 和 routeChangeComplete 事件:

import {useState} from "react";
import { useRouter } from "next/router";
import Loader from "../components/Loader"

export default function App({ Component, pageProps }) {
  const router = useRouter()
  const [loading, setLoading] = useState(false)
  router.events.on("routeChangeStart", (url) => {
    console.log("Route is changing");
    setLoading(true)
  });
  router.events.on("routeChangeComplete", (url) => {
    console.log("Route is changed");
    setLoading(false)
  });

  return (
    <>
    {loading && <Loader />}
    <Component {...pageProps} />;
    </>
  );
}

但是当我尝试切换到另一个页面时,我无法从我的 routeChangeStart 和 routeChangeComplete 事件中获取任何控制台日志。

【问题讨论】:

标签: javascript next.js


【解决方案1】:

在 Next.js examples 中,事件注册始终在 useEffect 挂钩内。我建议你像这样修改你的代码:

import {useState, useEfffect} from "react";
import { useRouter } from "next/router";
import Loader from "../components/Loader"

export default function App({ Component, pageProps }) {
  const router = useRouter()
  const [loading, setLoading] = useState(false)

  useEffect(() => { //<-- this useEffect will be triggered just one time at component initialization
      router.events.on("routeChangeStart", (url) => {
         console.log("Route is changing");
         setLoading(true)
      });
      router.events.on("routeChangeComplete", (url) => {
         console.log("Route is changed");
         setLoading(false)
      });
  }, []);
  
  return (
    <>
    {loading && <Loader />}
    <Component {...pageProps} />;
    </>
  );
}

【讨论】:

  • 是的,这解决了问题,但我仍然无法获得任何控制台日志或我的背景作为加载屏幕
  • @JayModi 发生这种情况是因为您将 img 放在 div 中(并且可能 img 的宽度和高度 = 0)。尝试将图像作为divbackgroudImage 放入类loaderContainer。您应该将图像视为背景。
  • 我也试过了,但仍然没有发布日志或加载图像。你知道任何可以防止这种情况发生的代码吗?
  • @JayModi 对于图像问题,尝试检查../uploads/bg1080x1920.jpg 是否是正确的路径?如果它是正确的,您是否尝试过导入图像?比如:import bg from '../uploads/bg1080x1920.jpg'; 然后&lt;img src={bg} /&gt;?
  • 是的,我试过了。问题是我放入 routeChangeStart 和 routeChangeComplete 的控制台日志没有显示,这意味着这些事件没有调用,因此加载程序没有显示图像。所以我认为我在 _app.js 代码中有错误。这是我的 github 链接以供进一步澄清(github.com/Jay-Bruh/TNA.git)
猜你喜欢
  • 1970-01-01
  • 2011-06-20
  • 2020-06-08
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 2021-12-29
  • 2020-11-04
  • 2020-07-25
相关资源
最近更新 更多