【问题标题】:How can I get (query string) parameters from the URL in Next.js?如何从 Next.js 中的 URL 获取(查询字符串)参数?
【发布时间】:2017-10-07 08:07:48
【问题描述】:

当我点击/index.js 中的链接时,它会将我带到/about.js 页面。

但是,当我通过 URL(如 /about?name=leangchhean)从 /index.js/about.js 传递参数名称时,我不知道如何在/about.js页面。

index.js

import Link from 'next/link';
export default () => (
  <div>
    Click{' '}
    <Link href={{ pathname: 'about', query: { name: 'leangchhean' } }}>
      <a>here</a>
    </Link>{' '}
    to read more
  </div>
);

【问题讨论】:

    标签: next.js query-string


    【解决方案1】:

    使用路由器挂钩。

    您可以在应用程序的任何组件中使用useRouter hook

    https://nextjs.org/docs/api-reference/next/router#userouter

    传递参数

    import Link from "next/link";
    
    <Link href={{ pathname: '/search', query: { keyword: 'this way' } }}><a>path</a></Link>
    
    要么
    import Router from 'next/router'
    
    Router.push({
        pathname: '/search',
        query: { keyword: 'this way' },
    })
    

    在组件中

    import { useRouter } from 'next/router'
    
    export default () => {
      const router = useRouter()
      console.log(router.query);
    
      ...
    }
    

    【讨论】:

    • router.query 仅适用于 ssr。但有时一个 url 参数传递到下一页但 router.query 无法获取此参数,您必须重新加载此页面才能使用 rotuer.query 获取他的参数。在这种情况下,使用 router.asPath 或 window?.location.search 获取参数。
    • 我的 route.query 与 url 不同
    【解决方案2】:

    使用 Next.js 9 或更高版本可以获取查询参数:

    router:

    import { useRouter } from 'next/router'
    
    const Index = () => {
      const router = useRouter()
      const {id} = router.query
    
      return(<div>{id}</div>)
    }
    

    getInitialProps:

    const Index = ({id}) => {
      return(<div>{id}</div>)
    }
    
    Index.getInitialProps = async ({ query }) => {
      const {id} = query
    
      return {id}
    }
    

    【讨论】:

    • 如果你们想获取查询字符串,例如localhost/abc?param=1,您应该将const {id} = router.query 变量更改为const {param} = router.query。为我工作
    • 不确定第 12 版是否有所改变,但我需要检查 router.isReady,否则 router.query 是一个空对象
    【解决方案3】:

    url 属性从 Next.js 版本 6 开始被弃用: https://github.com/zeit/next.js/blob/master/errors/url-deprecated.md

    要获取查询参数,请使用getInitialProps

    对于无状态组件

    import Link from 'next/link'
    const About = ({query}) => (
      <div>Click <Link href={{ pathname: 'about', query: { name: 'leangchhean' }}}><a>here</a></Link> to read more</div>
    )
    
    About.getInitialProps = ({query}) => {
      return {query}
    }
    
    export default About;
    

    对于常规组件

    class About extends React.Component {
    
      static getInitialProps({query}) {
        return {query}
      }
    
      render() {
        console.log(this.props.query) // The query is available in the props object
        return <div>Click <Link href={{ pathname: 'about', query: { name: 'leangchhean' }}}><a>here</a></Link> to read more</div>
    
      }
    }
    

    查询对象将像:url.com?a=1&amp;b=2&amp;c=3 变为:{a:1, b:2, c:3}

    【讨论】:

    • 是否可以防止刷新。我只想更新 url 而无需刷新
    • 在 Hooks 时代,选择useRouter 解决方案,它比getInitialProps 干净得多
    • 如何为单个参数添加多个值?前任。 a=1,2,3
    • @sanjeevshetty,如果你像这样传递你的a 参数,你可以把它作为一个字符串在query.a 中得到,"1,2,3",然后执行query.a.split(',') 得到["1", "2", "3"]
    【解决方案4】:

    如果您正在寻找适用于静态导出的解决方案,请尝试此处列出的解决方案:https://github.com/zeit/next.js/issues/4804#issuecomment-460754433

    简而言之,router.query 仅适用于 SSR 应用程序,但 router.asPath 仍然有效。

    因此可以在next.config.js 中使用exportPathMap(非动态)配置查询预导出:

        return {
          '/': { page: '/' },
          '/about': { page: '/about', query: { title: 'about-us' } }
        }
      }
    

    或者使用router.asPath 并使用query-string 之类的库自己解析查询:

    import { withRouter } from "next/router";
    import queryString from "query-string";
    
    export const withPageRouter = Component => {
      return withRouter(({ router, ...props }) => {
        router.query = queryString.parse(router.asPath.split(/\?/)[1]);
    
        return <Component {...props} router={router} />;
      });
    };
    

    【讨论】:

      【解决方案5】:
      • about.js 页面中使用以下代码获取它:

      // pages/about.js
      import Link from 'next/link'
      export default ({ url: { query: { name } } }) => (
        <p>Welcome to About! { name }</p>
      )

      【讨论】:

      【解决方案6】:

      如果您需要从组件外部检索 URL 查询:

      import router from 'next/router'
      
      console.log(router.query)
      
      

      【讨论】:

      • You should only use "next/router" on the client side of your app.
      【解决方案7】:
      import { useRouter } from 'next/router';
      
      function componentName() {
          const router = useRouter();
          console.log('router obj', router);
      }
      

      我们可以在路由器中找到查询对象,使用它我们可以获得所有查询字符串参数。

      【讨论】:

        【解决方案8】:

        Post.getInitialProps = async function(context) {
        
          const data = {}
          try{
            data.queryParam = queryString.parse(context.req.url.split('?')[1]);
          }catch(err){
            data.queryParam = queryString.parse(window.location.search);
          }
          return { data };
        };

        【讨论】:

        • 可以使用 context.req.query 从 getInitialProps 直接访问查询。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-20
        • 1970-01-01
        • 2014-02-14
        • 1970-01-01
        • 2020-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多