【问题标题】:How to get URL query string on Next.js static site generation?如何在 Next.js 静态站点生成中获取 URL 查询字符串?
【发布时间】:2021-02-10 09:06:30
【问题描述】:

我想在 Next.js 静态站点生成中从 URL 获取查询字符串。

我在 SSR 上找到了一个解决方案,但我需要一个用于 SSG 的解决方案。

谢谢

【问题讨论】:

标签: reactjs url next.js query-string ssg


【解决方案1】:

import { useRouter } from "next/router";
import { useEffect } from "react";

const router = useRouter();

useEffect(() => {
    if(!router.isReady) return;
    const query = router.query;
  }, [router.isReady, router.query]);

有效。

【讨论】:

    【解决方案2】:

    我确实找到了这样做的方法

    const router = useRouter()
    
    useEffect(() => {
        const params = router.query
        console.log(params)
    }, [router.query])
    

    【讨论】:

    • 我认为这行不通,useEffect 仅适用于客户端(例如,需要window),并且 OP 希望在服务器上预渲染。
    • 我知道,但是如果没有在客户端获取查询,就不可能做他想做的事,因为下一个 js 文档说:“getStaticProps 在构建时生成页面。没有办法知道自定义查询访问者可以在构建时使用的参数。”我们使用 getServerSideProps 的唯一方法。但是你会失去静态优化。
    【解决方案3】:

    您无权访问 getStaticProps 中的查询参数,因为它只在服务器上的构建时运行。

    但是,您可以在页面组件中使用 router.query 来检索客户端 URL 中传递的查询参数。

    // pages/shop.js
    
    import { useRouter } from 'next/router'
    
    const ShopPage = () => {
        const router = useRouter()
        console.log(router.query) // returns query params object
    
        return (
            <div>Shop Page</div>
        )
    }
    
    export default ShopPage
    

    如果页面没有数据获取方法,router.query 将在页面第一次加载时为空对象,此时页面在服务器上预生成。

    来自next/router 文档:

    query: Object - 解析为对象的查询字符串。这将是 如果页面没有data fetching requirements,则在预渲染期间为空对象。 默认为{}

    作为@zg10 mentioned in his answer,您可以通过使用useEffect 的依赖数组中的router.isReady 属性来解决此问题。

    来自next/router object 文档:

    isReady:boolean - 路由器字段是否更新 客户端并准备使用。只能在内部使用 useEffect 方法,不适用于在服务器上进行条件渲染。

    【讨论】:

    • 实际上在第一次加载时没有任何查询字符串。在 URL 中生成操作查询字符串之后。所以第一次加载会返回一个空值并报错。
    • 你不能在“动作”发生后检查查询字符串吗?同样的逻辑适用。如果您可以将代码添加到问题中,那也会很有帮助。
    猜你喜欢
    • 2021-04-19
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 2021-01-20
    • 2018-08-07
    相关资源
    最近更新 更多